i007.cc

i007.cc

优先队列-降维打击

MySQL无法存储Emoji表情,IPhone表情问题

今天有用户反馈,部分用户使用本站QQ 快捷登录后仍旧显示没登录,导致https://www.sojson.com/httpRequest/  工具使用不了,开始以为是个别用户的浏览器版本问题,尝试了  Chrome  ,  Firefox  等浏览器,还是不行。

然后和发现问题的用户使用Teamview 远程操作,我看线上日志,发现问题:

  1. [ERROR][2017-02-22 13:44:35,624][druid.sql.Statement]{conn-10013, pstmt-30392} execute error. insert into so_xxxx (id, nickname, email,
  2. portrait, password, security,
  3. create_time, last_login_time,link,intro,address,job,qq,level)
  4. values (?, ?, ?,
  5. ?, ?, ?,
  6. ?, ?,
  7. ?, ?, ?, ?, ?,?
  8. )
  9. 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 配置文件。修改或者添加一下内容。

  1. [mysql]
  2. default-character-set=utf8mb4
  3. [mysqld]
  4. 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 编码。

  1. alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin;

OK了,这是iPhone下输入的吻,拼音“wen”就会出来。

发表回复