最近我也遇到使用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