字符集和校对规则
在创建数据库、数据表的时候会指定 character 和 collate 。 如下:
CRREATE DATABASE db name DEFAULT CHARSET SET utf8 COLLATE utf 8 generalci ;
CREATE TABLE 、 note 、 (
`id` bigint(ll) unsigned NOT NULL AUTO INCREMENT,
`content` varchar(l28 ) CHARSET utf8 COLLATE utf8 bin NOT NULL COMMENT ’内容’,
//对某一个字段设直字符集和校对规则
PRIMARY KEY (`id` )
) ENGINE=InnoDB AUTO INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8 generalci ;
字符集指的是一种从二进制编码到某类字符符号的映射。 校对规则则是指某种字符集下的排序规则 。
MySQL 中每一种字符集都会对应一系列的校对规则 。
MySQL 采用类似继承的方式来设定字符集默认值,每个数据库以及每张数据表都有自己的默认值,它们逐层继承,最终最靠底层的默认设置将影响你创建的对象。
比如,在创建数据库时,将根据服务器上的 character_set_server 来设置数据库的默认字符集,同样的道理,根据 database 的字符集来指定库中所有表的字符集。
不管是对数据库,还是对表和列,只有在它们没有显式指定字符集的情况下,默认字符集才会起作用 。
MySQL 提供了很多字符集供使用,应该根据存储的内容选择能满足需求的最小字符集 。
如果存储的内容是英文字符等拉丁语系字符的话,那么使用默认的 latinl 编码即可;如果需要存储汉字、俄文 、 阿拉伯语等非拉丁语系字符,则建议使用 UTF8 字符集 。
而校对规则一般来说只需要考虑是否以大小写敏感的方式比较字符串或者是否用字符串编码的二进制形式来比较大小,其对应的校对规则的后缀分别是_cs 、 _ci 和_bin 。
大小写敏感和二进制校对规则的不同之处在于,二进制校对规则直接使用字符的字节进行 比较,而大小写敏感的校对规则在多字节字符集情况下 , 如德语,有更复杂的比较规则 。
一般我们选择大小写不敏感的校对规则即可 。
UTF8 是我们常用的字符集,其对应的常用校对规则如下 :
utf8_general_ci:UTF8 的默认校对规则 。 这是一个遗留的校对规则,不支持扩展 ,仅能够在字符之间进行逐个比较,因此比较速度很快。
utf8_unicode_ci :根据 Unicode 校对规则算法( UCA )执行,其最主要的特色是支持扩展,即可以把一个字母看作与其他字母组合相等。 但其仅部分支持 Unicode 校对规则算法,仍有一些字符是不能支持的,并且不能完全支持组合的记号 。 其正确性要比 utf8general_ci 高 。
utf8_bin : 将字符串每个字符用二进制数据编译存储,区分大小写 ,而且可以存二进制的内容 。
通常情况下, utf8_general_ci 的准确性足够我们使用 。
此外,如果数据库需要支持 emoji 字符,那么字符集应该用 UTF8MB4 ,校对规则使用utf8mb4bin。
UTF8MB4 是 MySQL 在 5.5.3 之后增加的编码, MB4 就是 Most Bytes 4 的意思, 专门用来兼容 4 字节的 Unicode。
它是 UTF8 的超集,除了将编码改为 UTF8MB4 外不需要做其他转换。