最近有同事问我MySQL中创建数据库时应该选择哪种字符集?我说我一般选择使用utf8,他问我为什么?这个问题一直没有好好总结过,虽然也能说几点理由,但是总归不够系统。因此花时间对MySQL中的字符集和排序规则做一个总结。
首先,可以通过SHOW CHARSET来查看MySQL支持的字符集,如下图所示,MySQL支持41种字符集,其中Maxlen列表示该字符集中单个字符占用的最大字节数。
可通过SHOW COLLATION查看排序规则
如上图所示,每种字符集有多种排序规则,排序规则名称的后缀代表来不同含义(参考MySQL5.7文档10.3.1节):后缀含义
_ai重音不敏感
_as重音敏感
_ci大小写不敏感
_cs大小写敏感
_bin二进制编码排序
其次,对于字符串类型的列,我们可以从4个级别配置该列对应的字符集和排序规则,按优先级从高到低排列如下:列级别>表级别>数据库级别>服务器级别。前面三个级别可在相应对象的创建或者修改语句中指定,数据库级别的还可通过系统变量character_set_database和collation_database指定默认值,服务器级别的可通过系统变量character_set_server和collation_server指定。
第三,通过SHOW VARIABLES like '%character%'命令可以看到一些字符集相关的系统变量。character_set_client用于解码接受到的客户端请求数据
character_set_connection用于将上一步解码后的数据再转码为该变量指定的字符集编码后再由服务器进行后续处理
character_set_results用于编码给客户端响应的数据。
最后,在实际使用中,最好统一使用同一种字符集,以免造成乱码。根据个人开发经验,大多数情况下使用utf8字符集即可。但是要注意MySQL中的utf8是阉割版的,只支持最多3个字节的字符,utf8mb4才是标准的utf8字符集。