推荐大家看深入MySQL字符集设置,区分检查client端、server端的编码;最简单暴力的方式,是在所有的环节都显式明确的指定相同的编码。
比如使用python的MySQLdb连接MySQL时默认的charset是latin1,需要自己指定charset=’utf8′,即使是在服务器端的init-connect=’SET NAMES utf8′,MySQLdb也会使用latin1覆盖该选项;可以参照这篇文章;
关于emoji表情的话mysql的utf8是不支持,需要修改设置为utf8mb4,才能支持,详细emoji表情与utf8mb4的关系。
MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区, BMP是从哪到哪,到http://en.wikipedia.org/wiki/Mapping_of_Unicode_characters这里看,基本就是0000~FFFF这一区。 从MYSQL5.5开始,可支持4个字节UTF编码utf8mb4,一个字符最多能有4字节,所以能支持更多的字符集。
utf8mb4 is a superset of utf8
utf8mb4兼容utf8,且比utf8能表示更多的字符。
修改数据库配置文件/etc/my.cnf
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
重启MySQL(按照官方文档,这两个选项都是可以动态设置的,但是实际的经验是Server必须重启一下)
已有的表修改编码为utf8mb4
ALTER TABLE tbl_name CONVERT TO CHARACTER SET charset_name;
使用下面这个语句只是修改了表的default编码
ALTER TABLE etape_prospection CHARSET=utf8;
客户端的JDBC驱动的版本也是有要求的。低版本JDBC驱动是不支持utf8mb4字符集的。有篇博客对JDBC驱动版本做过实验,mysql-connector-java-5.1.31及其以上的版本能够支持。
因为utf8mb4是utf8的超集,理论上即使client修改字符集为utf8mb4,也会不会对已有的utf8编码读取产生任何问题。
这里附上几篇如何配置MySQL UTF8MB4的文章:
Mysql支持emoji 表情符号 升级编码为UTF8MB4
文章链接:MySQL设置utf8mb4编码
让Mysql支持Emoji表情
mysql 5.5 升级 与 MySQL utf8mb4 字符集