UTF-8:是通用型的,兼容所有文字编码规则
ISO8859-1:也是一种编码标准,一般存放英文和数字。存放中文会造成乱码。
1. ASCII用途:用来映射简单的单字节字符,比如大小写英文字母、阿拉伯数字、常用的标点符、运算符、控制字符等。
编码范围:U+0000 - U+007F
注意:对于用这类字符的场景够用了,但是却无法表达比如汉字,日文等编码。
2. UNICODE
用途:用来映射包含 ASCII 以内的其他的所有字符。
编码范围:U+0000 - U+10FFFF
注意:ASCII 是 UNICODE 的子集,ASCII 编码的字符可以无损转换为 UNICODE 编码的字符。
MySQL 常用字符集
1. Latin1
Latin1 是 cp1252 或者 ISO-8859-1 的别名。ISO-8859-1 编码是单字节编码,向下兼容 ASCII。
编码范围:U+0000 - U+00FF
ISO-8859-1 收录的字符除 ASCII 收录的字符外,还包括西欧语言、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号。
单字节内的空间都被 ISO-8859-1 编码占用,所以能够用 ISO-8859-1 编码存储、传输其他任何编码的字节流。
比如把一个 Utf8mb4 的编码或者 GBK 的编码存入 Latin1,不会有任何问题。因为 Latin1 保留了原始的字节流,这也就是 MySQL 长期以来把 Latin1 做默认字符集的原因。
但是由于 Latin1 对任何字符都存放字节流,造成了字符个数的浪费。
比如:
CHAR(10) CHARACTER SET LATIN1CHAR(10) CHARACTER SET UTF8
该字段中存储字符个数 UTF8 是 Latin1 的三倍!!!
2. GB18030
GB18030 是中国官方标准字符集,向前兼容 GBK、GB2312,是这两个的超集。用 1、2、4 个字节分别表示一个符号。比如对一般中文字符,默认是用两个字节编码存储。Windows 系统,默认用的就是 GB18030。
若只是存储中文字符,那 GB18030 最佳。
原因有两点:
1)占用空间小,比如比 UTF8 小。
2)存储的汉字根据拼音来排序,检索快。
3. UTF8
UTF8 是 Unicode 的编码实现,可以存储 UNICODE 编码对应的任何字符, 这也是使用最多的一种编码。最大的特点就是变长的编码方式,用 1 到 4 个字节表示一个符号,可以根据不同的符号编码字节长度。
字母或数字用 1 字节,汉字用 3 字节,emoji 表情符号用 4 字节。UTF8 字符集目前是使用最广泛的。
注意!MySQL 里常说的 UTF8 是 UTF8MB3 的别名,UTF8MB3 是 UTF8MB4 的子集,UTF8MB4 才是真正的 4 字节 UTF8 字符集!
UTF8MB3 表示最大支持 3 个字节存储字符,UTF8MB4 表示最大 4 个字节存储字符。根据实际需要和未来展望,MySQL 8.0 已经默认用 UTF8MB4 基础字符集。
UTF有UTF-8、UTF-16、UTF-32三种编码,8、16、32的区分实际上就是对于UTF以多少位为单元进行编码,UTF-8是以8位二进制即一个字节为单元,UTF-16以两个字节为单元,UTF-32以四个字节为单元,通过编码进行传输。 UTF-8的传输规则实际上是这样的: 对于单字节的字符,字节码第一位为0,后7位为该字符的Unicode码,因此对于非扩展的ASCII码,其编码与UTF-8相同。 对于n个字节(n>1)的字符,字节码的第一个字节前n位为1,n+1位为0,后面字节前两位为10,其余位为该字符的Unicode码。 UCS-2与UTF-8的具体传输规则如下(左UCS-2右UTF-8): 0000– 007F—>0xxx xxxx 1字节 0080– 07FF—>110x xxxx 10xx xxxx 2字节 0800– FFFF—>1110 xxxx 10xx xxxx 10xx xxxx 3字节 依据以上规则就可以进行Unicode与UTF-8的转换。 比如中文字符”啊”的Unicode码为\u554A,将其转换为二进制为0101 0101 0100 1010,根据其Unicode码所在区为0800 – FFFF,将二进制码依次从右往左代入x得到1110 0101 1001 0101 1000 1010换为16进制码则为E5 95 8A,此3字节码即为中文字符”啊”的UTF-8码。 中文字符为2字节,而在进行中文输入法时有些字符如空格” ”依然只占一个字节,或者需切换输入法来代替,因此在进行某些中文字符串 *** 作时对该字符应该采用两个相同的1字节字符代替。 如数据库进行查询 *** 作时的查询某个表中第二个字为”啊”的内容: SELECT value FROM tabel WHERE LIKE ‘__啊%’此中用了两个单字节的'_'来表示一个中文字符即是如此。 还有个小知识,编码的存储方式有两种,分别为Big Endian和Little Endian。 此两种存储方式的区别在于,对于双字节的编码,其两组16进制码是谁前谁后问题,按照编码方式正序存储,则为Big Endian,反序存储则为Little Endian。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)