伊成博客
伊成博客

MySQL无法保存emoji表情的终极解决方案

“MySQL无法保存emoji表情的终极解决方案”

问题背景

在公司里面需要做一个留言板的功能,拿到产品的需求三下五除二的就把表结构就设计出来了,在以往的开发经验中毫无疑问的就把表字符集设置为了utf8。于是就碰到在留言中一旦含有emoji表情的就无法保存到数据库里,就会提示下面这个异常:

1
java.sql.SQLException: Incorrect string value: '/xF0/x9F/x92/x94' for colum n 'content' at row 1at

问题的前世今生

在最开始设计表结构的时候,采用的 utf8
在MySQL中的 utf8 最多支持的是3个字节,而我们要保存的emoji表情是4个字节,所以就保存不到数据库里面。

经过一番查询资料,我们只要更改字符编码即可,那问题又来了,更改字符编码选择哪一个呢?

认识 utf8md4

MySQL在5.5.3之后增加了这个utf8mb4的编码,mb4就是most bytes 4的意思,它专门用来兼容四字节的unicode。
好在utf8mb4是utf8的超集,除了将编码改为utf8mb4外不需要做其他转换。
当然,为了节省空间,一般情况下使用utf8也就足够了。

MySQL无法保存emoji表情的终极解决方案

  1. MySQL 配置文件修改
    找你安装Mysq路径下的配置文件my.ini 或者是default.ini 配置文件,修改一下内容。
    1
    2
    3
    4
    [mysql]  
    default-character-set=utf8mb4
    [mysqld]
    character-set-server=utf8mb4

修改完成后,记得重启mysql !

  1. 修改 数据库的字符集
    可以使用MySQL客户端连接数据库,修改数据库的字符集
    utf8mb4 – UTF-8 Unicode

  2. 修改 表的字符集 和 对应字段的字符集
    utf8mb4

做完以上的修改之后,可以现在对应的字段中保存一个emoji表情实验一下,看能否保存成功。如果能保存成功则说明我们设置正确了!

  1. 确保MySQL connection的版本 ,连接串
    确认MySQL connection要高于5.1.13 否则仍然不能试用utf8mb4。

连接串

1
spring.datasource.url=jdbc:mysql://localhost:3306/test?characterEncoding=utf8&characterSetResults=utf8&autoReconnect=true&failOverReadOnly=false

在项目中往往都会加上 characterEncoding=utf8 , 如果还不能保存emoji表情,这里也去掉。

以上就是解决方法,如果有不正确的地方,欢迎指出!

支付宝打赏 微信打赏

如果本文对你有所帮助,请打赏 1元就足够感动我 :)