MySQL无法存储Emoji表情,IPhone表情问题
今天有用户反馈,部分用户使用本站QQ 快捷登录后仍旧显示没登录,导致https://www.sojson.com/httpRequest/ 工具使用不了,开始以为是个别用户的浏览器版本问题,尝试了 Chrome , Firefox 等浏览器,还是不行。
然后和发现问题的用户使用Teamview 远程操作,我看线上日志,发现问题:
[ERROR][2017-02-22 13:44:35,624][druid.sql.Statement]{conn-10013, pstmt-30392} execute error. insert into so_xxxx (id, nickname, email,portrait, password, security,create_time, last_login_time,link,intro,address,job,qq,level)values (?, ?, ?,?, ?, ?,?, ?,?, ?, ?, ?, ?,?)java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x8B\xF0\x9F...' for column 'nickname' at row 1
确定问题了,数据编码问题。进一步查证发现是 Mysql 的Utf-8 编码不支持Emoji 和IPhone 手机的一些表情符号。
UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。解决方案就是:将Mysql的编码从utf8转换成utf8mb4。(引入语句)
解决方案:
1.修改配置文件。
找到 Mysql 配置文件my.ini 或者是default.ini 配置文件。修改或者添加一下内容。
[mysql]default-character-set=utf8mb4[mysqld]character-set-server=utf8mb4
或者使用工具如下图
2. 修改环境变量。
以root 身份登录 Mysql ,修改环境变量,将character_set_client, character_set_connection,character_set_database ,character_set_results ,character_set_server 都修改成 utf8mb4 编码。
3. 将原来的表数据转换为 utf8mb4 编码。
alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;
OK了,这是iPhone下输入的吻,拼音“wen”就会出来。
