MySQL报错:Cause: java.sql.SQLException: Incorrect string value: 'xE6x9DxA8","...'
Posted fanblogs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL报错:Cause: java.sql.SQLException: Incorrect string value: 'xE6x9DxA8","...'相关的知识,希望对你有一定的参考价值。
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.
2、首先确保mysql的版本不能太低:需要mysql 5.5+,select version();
下面是小编的mysql数据库的版本号
3、查看数据库编码show variables like ‘%char%‘;
改成utf8mb4 命令语句是set character_set_server=utf8mb4
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
原因:系统变量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;
以上是关于MySQL报错:Cause: java.sql.SQLException: Incorrect string value: 'xE6x9DxA8","...'的主要内容,如果未能解决你的问题,请参考以下文章
mysql 执行报错:Error querying database. Cause: java.sql.SQLSyntaxErrorException:which is not functionall
mysql 执行报错:Error querying database. Cause: java.sql.SQLSyntaxErrorException:which is not functionall
报错处理:Cause: java.sql.SQLException: The server time zone value
报错处理:Cause: java.sql.SQLException: The server time zone value
报错处理:Cause: java.sql.SQLException: The server time zone value