1、字符集和比较规则简介
1.1、字符集简介
所谓字符集就是字符和实际存储的二进制数据之间的映射关系。映射关系包括两个方面:
- 字符范围:字符范围就是指字符集所能表示的字符数量,有的字符集只能表示英文和常见标点符号,有的字符集能够表示所有主流的文字符号,甚至能够表示emoji表情。
- 编码规则:编码规则就是字符如何转换为二进制。
1.2 、比较规则简介
比较规则是在字符集的基础上,对字符的大小进行比较。例如最简单的,直接比较字符的二进制数据的大小。当然这种比较规则不实用。
1.3、常见的字符集
- ASCII字符集:共128个字符,包括大小写字母、标点符号、空格、数字和一些其它不可见字符,使用1个字节编码。
- ISO 8859-1字符集:在ASCII字符集基础上新增128个字符,包括西欧常用字符,也被称为Latin1字符,使用1个字节编码。
- GB2312字符集:收录汉字、拉丁字母、希腊字母、平假名、片假名和俄语西里尔字母。其中汉字6763个,其他文字符号682个。该字符集兼容ASCII字符集,所以是ASCII字符集的字符用1个字节编码,否则用2个字节编码。这种编码规则成为变长编码。
- GBK字符集:在GB2312字符集的基础上进行扩充,编码规则兼容GB2312字符集。
- UTF-8字符集:几乎收录了世界上所有国家和地区使用的自古,并且在不断扩充。该字符兼容ASCII字符集,采用变长编码的规则,每个字符需要1-4个字节。此处需要注意:UTF-8是Unicode字符集的一种编码规则,除此以外还有UTF-16采用2-4个字节编码,UTF-32采用4个字节编码。
2、MySQL中的字符集和比较规则
2.1、utf8和utf8mb4
UTF-8使用1-4个字节表示一个字符,但是在MySQL中utf8使用1-3个字节表示一个字符,也是uft8mb3的别名。如果想要完整表示UTF-8字符集,在MySQL中需要选择utf8mb4,utf8mb4是使用1-4个字节表示一个字符,字符范围和Unicode相同。
2.2、 比较规则
MySQL比较规则名称由三个部分组成,以uft8_general_ci为例:
- 第一部分表示比较规则关联的字符集,此处为utf8。
- 第二部分表示比较规则适用的语言,此处为通体规则。除此以外,还有polish表示波兰语比较规则,spanish表示西班牙语比较规则等。
- 第三部分表示比较规则是否区分重音和大小写等。ci表示不区分大小写。
3、字符集和比较规则的应用
MySQL有4个级别的字符集和比较规则,从大到小依次为:
- 服务器级别:启动服务器时,由配置文件、启动选项或者使用SET语句来确定。
- 数据库级别:创建和修改数据库时可以指定,如果不指定那么就会使用服务器级别。
- 表级别:创建和修改表时可以指定,如果不指定那么就会使用数据库级别。
- 列级别:创建和修改列时可以指定。如果不指定那么就会使用表级别。注意:修改字符集的时,如果列中数据不能用新字符集表示,便会发生错误。例如列中原来用utf8存储的汉字,现修改为ascii字符集,ascii无法表示汉字,会发生错误。
如果只修改字符集,比较规则会变为修改后字符集的默认值;只修改比较规则,字符集会变为修改后比较规则的对应的字符集。
4、总结
字符集由字符范围和编码规则组成。MySQL的utf8最多只能用3个字节表示字符,想要完整对应Unicode,需要使用utf8mb4字符集。MySQL的字符集和比较规有四个级别,范围小的级别如果不指定,就会直接继承范围大级别。字符集和比较规则相互关联,只改变其中一个,另一个也会改为对应的默认值。