java.sql.BatchUpdateException: Incorrect string value: ‘\xF0\x9F\x91\x91**...‘
这个错误是由于 MySQL 数据库无法存储 Emoji 表情等特殊字符 引起的,具体原因是数据库字符集配置不支持 4 字节的 UTF-8 字符(如 Emoji)。以下是完整的解决方案:
问题原因
-
\xF0\x9F\x91\x91
是一个 Emoji 字符(👑) -
MySQL 默认的
utf8
字符集只支持 3 字节字符 -
需要
utf8mb4
字符集才能存储 4 字节的 UTF-8 字符
解决方案
步骤 1:修改数据库字符集
-- 修改数据库字符集
ALTER DATABASE your_database_name
CHARACTER SET = utf8mb4
COLLATE = utf8mb4_unicode_ci;-- 修改表字符集
ALTER TABLE your_table_name
CONVERT TO CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;-- 修改特定列的字符集(如果只需要改某些列)
ALTER TABLE your_table_name
MODIFY payer VARCHAR(255)
CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
步骤 2:修改 MySQL 配置文件 (my.cnf/my.ini)
[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:验证数据库字符集
-- 检查数据库
SELECT @@character_set_database, @@collation_database;-- 检查表
SHOW CREATE TABLE your_table_name;-- 检查连接
SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';
步骤 4:更新 JDBC 连接字符串
在应用配置中添加 characterEncoding
和 useUnicode
参数:
# application.properties
spring.datasource.url=jdbc:mysql://localhost:3306/your_database?
useUnicode=true&characterEncoding=utf8mb4&
connectionCollation=utf8mb4_unicode_ci&
useSSL=false&serverTimezone=UTC
步骤 5:验证字符集支持(可选)
创建测试表验证:
CREATE TABLE emoji_test (id INT PRIMARY KEY AUTO_INCREMENT,emoji VARCHAR(255)CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;INSERT INTO emoji_test (emoji) VALUES ('👑');
完整解决方案流程
-
备份数据库:防止操作失误
-
修改数据库/表字符集:执行步骤 1 的 SQL
-
修改 MySQL 配置:步骤 2
-
重启 MySQL 服务
-
更新应用配置:步骤 4
-
重启应用程序
常见问题处理
-
索引长度问题:
-- 修改索引长度 ALTER TABLE your_table MODIFY payer VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
(InnoDB 索引最大长度 767 字节,191 字符 × 4 字节 = 764 字节)
-
连接池配置:
确保连接池不缓存旧字符集的连接:# HikariCP 配置 spring.datasource.hikari.connection-init-sql=SET NAMES utf8mb4
-
MySQL 版本要求:
-
MySQL 5.5.3+ 支持
utf8mb4
-
建议使用 MySQL 5.7+ 或 MySQL 8.0
-
-
如果无法修改数据库:
// 在 Java 中过滤 Emoji public String removeEmoji(String input) {return input.replaceAll("[^\\u0000-\\uFFFF]", ""); }
验证是否解决
-
尝试插入包含 Emoji 的数据:
INSERT INTO your_table(payer) VALUES ('测试 👑 表情');
-
检查数据是否正常存储
-
应用程序执行原操作,确认错误消失
重要提示:修改字符集后,确保所有相关表都转换为
utf8mb4
,否则部分表仍可能出现类似错误。
通过以上步骤,即可彻底解决 Incorrect string value
错误。