欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-02 14:57:55
...

假设你数据库用的是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了,开森!