解决Springboot JPA + mysql 无法添加emoji问题

假设你数据库用的是utf-8编码,在没有解决emoji编码之前,会报类似以下错误:

Incorrect string value: '\xF0\x9F\x98\xAC' for column 'user_name'

其原因是因为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;

附上可能需要用到的其他操作:

修改数据库编码: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;

完成了第一步,你就可以通过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 //这是最重要的一步

完成上述两步,就可以通过JPA插入emoji了,开森!

你可能感兴趣的:(SpringBoot)