MySQL的字符集

202 阅读2分钟

MySQL的字符集

为什么需要字符集?

计算机只能存储二进制,为了方便存储信息,我们对于不同的字符与二进制之间的对应维护了一套映射关系,这一套映射关系就称为“字符集”。将字符表示为二进制的过程叫做编码,将二进制解析为字符的过程叫解码。

常见的字符集

  • ASCII:一共收录128个字符,包括英文大小写和空格、标点符号等。可以用一个字节完成编码。
  • ISO 8859-1:在ASCII基础上,新增了128个字符,用于表示德、法语言,依然可以用一个字节完成编码。
  • GB2312:收录类型更加充分。兼容ASCII,如果字符是ASCII里的,用一个字节编码,否则用两个字节。
  • GBK:在GB2312上扩展了一些。
  • UTF-8:收录了凡是地球上所有能想到的字符,并且还在不断扩充。UTF-8Unicode的一种编码方案,除了UTF-8外,还有UTF-16UTF-32UTF-8采用变长的编码方案,长度范围是1字节到4字节。

Q&A

1.在MySQL字段信息中,经常看到编码方式是utf8mb3utf8mb4,这两种字符集和UTF-8有什么关系呢?

utf8mb3是采用1-3字节编码的UTF-8utf8mb4是采用1-4字节编码的UTF-8.
为了节省空间,MySQL的设计者对UTF-8做了“阉割”,而utf8mb3正是UTF-8的“阉割版”,目前UTF-8默认指的就是utf8mb3UTF-8使用1-4个字节完成编码,而utf8mb3使用1-3个字节完成编码。而utf8mb4则是正规的UTF-8,使用1-4字节变长编码。在需要使用emjoy表情的场景中,还是需要选择utf8mb4

2.字符集utf8mb4_unicode_ci后的_ci表示什么意思?

在比较时不区分大小写。
除了_ci之外,还有如下的后缀:

后缀代表的含义
_ai不区分重音
_as区分重音
-ci不区分大小写
_cs区分大小写
_bin以二进制进行比较

可以使用SHOW COLLATION LIKE 'utf8\_%'查看某一字符集的比较规则,DEFAULT列为YES代表的就是默认的。