博客支持Emoji啦😋😋😋! 博客的数据库使用的是 MySQL。MySQL在5.5版本之前,对UTF-8的支持最多只支持到3个字节,从5.5开始支持4个字节的UTF-8。 3个字节的UTF-8基本只覆盖了 UNICODE 的 BMP(Basic Multilingual Plane) 字符,而 Emoji 表情符号,恰好就不在这个范围内。 往不支持4个字节UTF-8编码的MySQL字段里面插入数据时,将得到类似: ``` Incorrect string value: '\xF0\x9F\x98\x82' for column 'content' at row 1 ``` 的错误。 要使 MySQL 支持4个字节的UTF-8,关键做法是:把表的字段定义(修改)由`utf8_general_ci`修改为`utf8mb4_unicode_ci`。 ## 简要步骤 升级数据库前记得备份!!! ### 设置数据库字符集 ```sql ALTER DATABASE 数据库名字 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci; ``` ### 设置表的字段字符集 有多少表、表有多少字段需要改,就要执行多少条语句。类似这样: ```sql ALTER TABLE `posts` CHANGE `title` `title` TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL; ``` ### 设置服务端、客户端字符集 修改 `my.cnf` 中对应字段值: ```ini [client] default-character-set = utf8mb4 [mysql] default-character-set = utf8mb4 [mysqld] character-set-client-handshake = FALSE character-set-server = utf8mb4 collation-server = utf8mb4_unicode_ci ``` 在 macOS 应该是没有这个配置文件的(听说已是最优),手动创建并放在以下位置之一即可: ``` Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr/local/etc/my.cnf ~/.my.cnf ``` ### 重启服务端 一定要重启服务端,不然可能无效。类似下面之一: ```bash $ service restart mysql $ service mysql restart $ brew services restart mysql ``` ## 关于UTF-8 UTF-8 本身是不定长编码的,支持 1~4 个字节的字符编码。 但是呢,MySQL 的 utf8 只支持 1~3 个字节,utf8mb4 才支持 4 个字节。 于是网上就有人把 utf8mb4 当成了一种新的 UTF-8 编码,可怕!还有人说 utf8mb4 是 utf8 的超集。。。 😂😂😂😂😂