假设你数据库用的是utf-8编码,在没有解决emoji编码之前,会报类似以下错误:
Incorrect string value: '\xF0\x9F\x98\xAC' for column 'user_name'
- 1
其原因是因为utf8无法保存emoji表情。在写解决办法之前先补充一下utf8mb4的概念:
什么事utf8mb4?utf8mb4它是utf8的超集并兼容utf8的所有字符集,其中mb4表示most bytes
4,就是说字符编码可以用1~4个字节去编码。
用utf8mb4的原因:
在mysql中utf8只支持字符长度最大为3个字节的字符,而emoji是长度为4个字节的字符,因此,普通的utf8编码不能满足emoji的要求,这时就需要用到utf8mb4编码。(提示:utf8mb4要求mysql版本在5.5.3以上)
下面进入正题,如何解决题目中emoji问题:
第一步,修改对应字段编码,将其改为utf8mb4编码
修改字段编码:ALTER TABLE table_name CHANGE column_name column_name VARCHAR(255) CHARACTER SET utf8mb4 NULL DEFAULT NULL;
- 1
附上可能需要用到的其他操作:
修改数据库编码:SET character_set_database = utf8mb4; 或
alter database db_name character set utf8mb4
修改数据表编码:ALTER TABLE db_name CHARACTER SET = utf8mb4;
查看数据库编码:SHOW CREATE DATABASE db_name;
查看表编码:SHOW CREATE TABLE tb_name;
查看字段编码:SHOW FULL COLUMNS FROM col_name;
- 1
- 2
- 3
- 4
- 5
- 6
完成了第一步,你就可以通过mysql手动插入emoji数据,但是通过Springboot插入数据还是会报错,这时就需要下面这步:
第二步修改tomcat的sql插入编码,修改yml文件:
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/database?useUnicode=true&characterEncoding=utf-8&autoReconnect=true
username: root
password: '123456'
tomcat:
init-s-q-l: SET NAMES utf8mb4 //这是最重要的一步
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
完成上述两步,就可以通过JPA插入emoji了,开森!