遇到 java.sql.SQLException: Incorrect string value: '\xF0\xA5\x95\x9B\xE9\x95...' for column '字段' at row 1 错误时,通常是由于字符集不匹配导致的。这种错误意味着你尝试插入的数据包含一些当前数据库或表的字符集无法识别的字
错误原因
这个错误的根本原因是数据库表的字符集设置不支持你要插入的数据中的某些字符。例如,字符集可能不支持一些特殊符号、表情符号或者其他UTF-8扩展字符该错误通常出现在以下情况中:
- 字符集不匹配:错误中的
\xF0\xA5\x95\x9B
是一个 Unicode 字符的字节表示,通常它表示的是一个表情符号或其他 Unicode 扩展字符。这种字符在 utf8 字符集下无法正确存储,因为 utf8 字符集最多只能存储 3 字节的字符,而表情符号和其他一些字符需要 4 字节。 - 字符集不支持:如果字段使用的是 utf8 或其他不支持 4 字节字符的字符集(例如 latin1),它们无法正确存储 utf8mb4 中包含的字符。utf8mb4 支持所有 Unicode 字符,而 utf8 只支持最多 3 字节的字符,因此在存储这些字符时会导致错误。
- 字符集设置错误:数据库在创建或配置时未正确设置字符集,导致不支持存储特殊字符。
案例
xml
-- 中文生僻字 显示4
SELECT LENGTH('𥕛') FROM users;
-- 普通中文 显示3
SELECT LENGTH('是') FROM users;
-- 表情 显示4
SELECT LENGTH('🤮') FROM users;
解释
在 MySQL 中,LENGTH 函数返回的是字符串的字节长度,而不是字符数。不同字符的字节长度取决于所使用的字符集:
- utf8 字符集:最多支持 3 字节的字符(不支持一些表情符号和扩展字符)。
- utf8mb4 字符集:最多支持 4 字节的字符(包括表情符号和许多扩展汉字)。
因此,LENGTH 返回的结果取决于字符编码和字符的实际字节大小:
- 对于 utf8mb4 字符集,字符 '𥕛' 和表情符号 '🤮' 都是 4 字节字符。
- 对于普通汉字 '是',它是 3 字节字符,在 utf8 和 utf8mb4 编码下都是 3 字节。
解决办法
-- 查看表字符集 SHOW FULL COLUMNS FROM table_name;
- 修改表结构
xml
-- 修改表字符集(示例设置为utf8mb4)
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
执行效果:
- 将整个表的字符集更改为 utf8mb4,如果表中有任何列使用其他字符集(如 latin1 或 utf8),它们也将被转换为 utf8mb4。
- 将整个表的排序规则更改为 utf8mb4_unicode_ci,这意味着所有文本类型的列(如 VARCHAR, TEXT 等)将遵循此新的排序规则
- 修改表单个字段结构 要对 MySQL 中表的 单个字段(列)修改字符集,可以使用 ALTER TABLE 语句来指定修改该字段的字符集和排序规则。具体的 SQL 语法如下:
xml
-- 修改单个字段的字符集和排序规则
ALTER TABLE table_name
MODIFY COLUMN column_name
VARCHAR(255)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
解释:
- table_name:你要修改的表的名称。
- column_name:你要修改字符集的字段(列)的名称。
- VARCHAR(255):你需要为该字段指定一个数据类型。在修改字符集时,必须指定该字段的类型和长度。这里假设字段类型是 VARCHAR(255),你应根据实际情况替换成该字段的实际类型。
- CHARACTER SET utf8mb4:设置该字段的字符集为 utf8mb4。
- COLLATE utf8mb4_unicode_ci:设置该字段的排序规则为 utf8mb4_unicode_ci,这是一个区分大小写的 Unicode 排序规则。
注意事项:
- 在执行此操作时,确保目标字符集与字段数据类型兼容。
- 修改字符集可能需要对字段的现有数据进行转换,因此在执行之前,建议
备份数据
。 - 如果字段包含
大量数据(避免业务使用期间操作,大数据时操作有可能导致锁表应避免此时操作)
,修改字符集可能会需要一些时间。 - 完成后,需要再次使用
SHOW FULL COLUMNS FROM 表名
来验证字段的字符集和排序规则是否已正确更改
通过这种方法,你可以只修改某一列的字符集,而不是整个表。
执行后的结果如下:
结论
当遇到Caused by: java.sql.SQLException: Incorrect string value
错误时,我们需要检查数据库字符集配置、表结构和连接字符集等,确保它们能够正确处理特殊字符。如有必要,我们可以转换特殊字符的编码,以适应数据库的要求。 通过以上方法,我们可以解决该错误并正常存储特殊字符或表情符号到数据库中,保证应用程序的正常运行。在开发过程中,我们应尽量避免存储不支持的特殊字符,以免引起其他兼容性问题。