openshell 的个人博客 openshell 的个人博客

一天很长,但十年很短。

目录
MySQL出现Incorrect string value的解决方案
/    

MySQL出现Incorrect string value的解决方案

问题

今天项目线上突然报错:

java.sql.SQLException: Incorrect string value: '\xF0\x9F\x92\x9C' for column 'dzmc' at row 1.

首先确认不是代码的问题,然后通过打断点排查到数据都是汉字,也找不到问题。

经过排查数据库发现,该字段编码是utf8。由于utf8最多只支持存3个字节,所以当存储的汉字超过三个字节的时候就会报错。

另外一种情况就直接是数据库编码没设置对,比如设置成latin1了。

解决方案

有的汉字或者表情存储是需要四个字节的,这个时候就需要使用utf8mb4来存储了。

需要检查一下步骤,将编码设置为utf8mb4:

  1. 升级MySQL版本,MySQL版本需要高于5.5;

  2. 修改MySQL配置文件

    修改mysql配置文件my.cnf(windows为my.ini) 
    my.cnf一般在etc/mysql/my.cnf位置。找到后请在以下三部分里添加如下内容: 
    [client] 
    default-character-set = utf8mb4 
    [mysql] 
    default-character-set = utf8mb4 
    [mysqld] 
    character-set-client-handshake = FALSE 
    character-set-server = utf8mb4 
    collation-server = utf8mb4_unicode_ci 
    init_connect='SET NAMES utf8mb4'
    
  3. 数据库所有都应该更改为utf8mb4

  • 更改数据库编码:

    ALTER DATABASE DN_NAME  CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;
    
  • 更改表编码:

    ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET `utf8mb4` COLLATE `utf8mb4_general_ci`;
    
  • 更改列的编码

    ALTER TABLE  `TABLE_NAME`  MODIFY COLUMN  `COLUMN_NAME` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '列名' ;
    

标题:MySQL出现Incorrect string value的解决方案
作者:openshell
地址:http://blog.caiqz.cn/articles/2020/09/22/1600789322229.html