MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

时间:2021-02-26 20:13:03

1、插入MySQL表时,报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

错误原因:参数中带有emoji表情,插入数据库时,一些特殊字符如“繁星拜月????”,插入报异常

解决思路:因为字符编码集为utf8,不支持一些basic multilingual plane和补充字符,那么如何让mysql存储emoji表情,所以需要改成utf8mb4.

MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

2、首先确保mysql的版本不能太低:需要mysql 5.5+,select version();

下面是小编的mysql数据库的版本号

MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

 3、查看数据库编码show variables like '%char%';

改成utf8mb4  命令语句是set character_set_server=utf8mb4

MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

4. 将已经建好的表也转换成utf8mb4 
  命令1:ALTER TABLE `TABLE_NAME` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; (将TABLE_NAME替换成你的表名) 4. 将需要使用emoji的字段设置类型为: 

  命令2:ALTER TABLE `TABLE_NAME`MODIFY COLUMN `COLUMN_NAME`  text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

  总结就是将服务编码 表编码  字段编码  统统改成 utf8mb4

5、但执行第4步命令1,生产又报错:Specified key was too long; max key length is 767 bytes

MySQL报错:Cause: java.sql.SQLException: Incorrect string value: '\xE6\x9D\xA8","...' for column 'obj_value' at row 1

原因:系统变量innodb_large_prefix开启了,则对于使用DYNAMIC或COMPRESSED行格式的InnoDB表,索引键前缀限制为3072字节。如果禁用innodb_large_prefix,不管是什么表,索引键前缀限制为767字节。

       上述的bug很明显是索引超出了限制的长度767(公司项目生产上innodb_large_prefix禁用了):

       我发现报错的那张表建立了一个varchar类型的索引,字段【OBJ_ID】varchar(255)  是索引列,觉得没什么问题,其实不然,上述的767是字节,而varchar类型是字符,同时我发现我使用的字符集为(utf8mb4),这个指每个字符最大的字节数为4,所以很明显 4*255 > 767

所以就报上述错了(Specified key was too long; max key length is 767 bytes)。

       解决方法:1、改变varchar的字符数,我改成了字段【OBJ_ID】varchar(100) 就可以了, 100*4 <767;2、或者启用innodb_large_prefix,那么限制值会增加到3072;