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;
更新 2024-11-15
MySQL 8 之后版本的默认字符集已经变成了 utf8mb4
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式