mysql支持emoji设置


最近我也遇到使用MySQL存储emoji表情的困境了,一开始我是尝试将emoji表情字符转换成类似ubb标签的样式存储到mysql中。但是苹果一再扩充ios中的表情,实在赶不上发展的速度。最终还是回到大家通用的做法,让mysql支持存储emoji表情字符。

平时使用mysql字符集都是使用utf8,几乎不适用utf8mb4。因为ios emoji表情字符是4个字节的,所以需要使用utf8mb4。

失败了很多次,最后才弄明白是怎么回事。
一开始先按着大家讲的修改mysql配置。

[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

然后重启,mysql,查看mysql的编码

SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';

显示的结果:

+--------------------------+----------------------------+  
| Variable_name            | Value                      |  
+--------------------------+----------------------------+  
| character_set_client     | utf8mb4                    |  
| character_set_connection | utf8mb4                    |  
| character_set_database   | utf8mb4                    |  
| character_set_filesystem | binary                     |  
| character_set_results    | utf8mb4                    |  
| character_set_server     | utf8mb4                    |  
| character_set_system     | utf8                       |  
| character_sets_dir       | /usr/share/mysql/charsets/ |  
| collation_connection     | utf8mb4_unicode_ci         |  
| collation_database       | utf8mb4_unicode_ci         |  
| collation_server         | utf8mb4_unicode_ci         |  
+--------------------------+----------------------------+

当然还附加了解释,特别说明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,没有关系。但必须保证character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server为utf8mb4

修改表的字符集

ALTER TABLE `TABLE_NAME` CHARSET=utf8mb4, COLLATE=utf8mb4_general_ci;
ALTER TABLE `TABLE_NAME` CHANGE COLUMN `COL_NAME` `COL_NAME` VARCHAR(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci  NOT NULL DEFAULT '' COMMENT '';

到这里还是不行。

我又把数据库的字符集也修改了一下:

ALTER DATABASE `DB_NAME` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

依然不能用。

最后我也没有招了,以为又要无功而返。突然我想起来,程序(CodeIgniter)链接数据库参数中好像有个字符集设置。打开配置文件一看,果然,把字符集两项都改成utf8mb4就好了。
后来我反复测试了几次,把mysql配置文件复位,数据库字符集也恢复到原来的设置,都可以正常存取emoji表情。

MySQL 备份和导入
在启用了 utf8mb4 字符集之后,备份和导入时就不能再用默认参数了。
用 mysqldump 备份时,需要加入:

mysqldump --default-charater-set=utf8mb4

而在恢复备份或通过程序连接时,需要在每次连接打开之后发送下面这条 SQL 指令:

SET CHARSET utf8mb4

Archives