最近做项目遇到了存表情包的问题,作一下记录(省略了部分具体的语句,适合有基础的人员阅读):
utf8和utf8mb4
utf8不是utf-8,最多只支持3字节的字符,utf8mb4最多支持4个字节的字符,emoji表情是有四个字节的字符,所以存表情必须使用utf8mb4的字符集。
mysql
小于mysql5.5.3的版本不支持utf8mb4,所以建议考虑别的存储方案或者升级mysql。大于5.5.3的字段编码必须设置成utf8mb4。
彻底解决方案需要将mysql本身的编码配置成utf8mb4,然后重启,配置内容:
打开配置文件在相应的位置配置:
[mysqld]
character
-
set
-server=utf8mb4
collation_server=utf8mb4_unicode_ci
init-
connect
=
"SET NAMES utf8mb4"
[mysql]
default
-
character
-
set
=utf8mb4
如果是8.0以下的版本也可以不配置数据的编码,只配置相应的表的和列的即可,8.0以上的版本因为时间问题没有具体的根据驱动去尝试,各位大神如果有尝试的可以分享下结果。
spring boot项目中的配置(这里的坑就比较多了,因为一不小心就会被版本搞砸了)
配置前先注意一个pom引入时的版本对应问题,我用的是6.0.6
下面这个版本对应关系来自知乎这篇文章
MySQL中emoji表情包的存储问题 - 知乎
如果是数据库的配置不改,一定要注意选对的版本,使用版本还会跟springboot本身的版本有关联,尤其是使用多数据源和事务的时候,所以使用的过程中最好对应起来避免钻很多坑,选择好自己的版本后就需要对连接配置处进行修改。
我的是druid连接池,其他的需要根据自己的配置进行修改,修改要注意的是连接处:useUnicode=true&characterEncoding=UTF-8 编码不能设置utf8mb4,因为没有这个编码,直接用utf8或者utf-8,然后
connection-init-sqls: set names utf8mb4这个配置项必加(每个版本或者配置类型属性会有小的差异,自己查看源码寻找对应的配置项即可)
datasource: druid: master: driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource url: jdbc:mysql://127.0.0.1:3306/dbname?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true username: root password: root min-idle: 2 max-active: 3 max-wait: 6000 time-between-eviction-runs-millis: 6000 min-evictable-idle-time-millis: 300000 test-while-idle: true test-on-borrow: false test-on-return: false connection-init-sqls: set names utf8mb4
整体配置完成后再尝试表情存储成功 !如果还有问题别着急,一定更要看具体的错误信息调整