mysql utf8mb4 编码

更新日期: 2020-12-28 阅读次数: 13748 字数: 523 分类: MySQL

MySQL server version 5.5.3 or higher 引入了 utf8mb4 编码。

Utf8 与 Utf8mb4 的区别

Utf8 只能支持 1~3 个字节的字符

Utf8mb4 则可以支持 4 个字节的字符,而 emoji 则是以 4 个字节进行存储的。 所以要支持 emoji 则必须使用 Utf8mb4.

数据库与数据集表的 charset 是否需要同时设置

参考 http://stackoverflow.com/questions/24356090/difference-between-database-table-column-collation

如果数据表设置了字符集,那么数据库在创建的时候就不需要了。如果数据库创建的时候指定了字符集,而建表的时候没有指定,那么数据表会继承数据库的字符集设置。

所以,像 wordpress 这种,在数据表中指定了字符集的做法,理论上就不需要在建立数据库的时候再指定字符集了。

但是,实际中,我还是觉得应该在建数据库的时候指定字符集。仍然以 wordpress 为例,虽然官方的建表脚本指定了字符集,但是这并不代表所有的三方插件也会遵守这个规范。假如一个三方插件没有指定字符集,那么就会默认采用数据库的字符集。这样做就非常保险。

团队项目中,也会有同样的问题,你也无法完全确保其他人每次建表时都指定了字符集。

所以好习惯应该是

  • 建数据库时指定字符集
  • 建数据表时也指定字符集

utf8mb4_unicode_520_ci 与 utf8mb4_unicode_ci 有什么区别

瞄了一下 wordpress 当前版本 4.7.2 的建表语句

CREATE TABLE `wp_posts` (
  `post_title` text COLLATE utf8mb4_unicode_520_ci NOT NULL,
  ...
) ENGINE=InnoDB AUTO_INCREMENT=324 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;

可见 wordpress 已经支持了 utf8mb4, 但是 utf8mb4_unicode_520_ci 又是什么?

utf8_unicode_ci (with no version named) is based on UCA 4.0.0 weight keys (http://www.unicode.org/Public/UCA/4.0.0/allkeys-4.0.0.txt).

utf8_unicode_520_ci is based on UCA 5.2.0 weight keys (http://www.unicode.org/Public/UCA/5.2.0/allkeys.txt).

其他字段参考 http://stackoverflow.com/questions/37307146/difference-between-utf8mb4-unicode-ci-and-utf8mb4-unicode-520-ci-collations-in-m

Ci 是 case insensitive 的意思。

新建数据库以 utf8mb4 为默认编码

CREATE DATABASE test_db CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;

tags: mysql utf8mb4

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式