java.sql.BatchUpdateException: Incorrect string value: ‘\xF0\x9F\x91\x91**...‘

这个错误是由于 MySQL 数据库无法存储 Emoji 表情等特殊字符 引起的,具体原因是数据库字符集配置不支持 4 字节的 UTF-8 字符(如 Emoji)。以下是完整的解决方案:

问题原因

  1. \xF0\x9F\x91\x91 是一个 Emoji 字符(👑)

  2. MySQL 默认的 utf8 字符集只支持 3 字节字符

  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. 备份数据库:防止操作失误

  2. 修改数据库/表字符集:执行步骤 1 的 SQL

  3. 修改 MySQL 配置:步骤 2

  4. 重启 MySQL 服务

  5. 更新应用配置:步骤 4

  6. 重启应用程序

常见问题处理

  1. 索引长度问题

    -- 修改索引长度
    ALTER TABLE your_table 
    MODIFY payer VARCHAR(191) 
    CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

    (InnoDB 索引最大长度 767 字节,191 字符 × 4 字节 = 764 字节)

  2. 连接池配置
    确保连接池不缓存旧字符集的连接:

    # HikariCP 配置
    spring.datasource.hikari.connection-init-sql=SET NAMES utf8mb4
  3. MySQL 版本要求

    • MySQL 5.5.3+ 支持 utf8mb4

    • 建议使用 MySQL 5.7+ 或 MySQL 8.0

  4. 如果无法修改数据库

    // 在 Java 中过滤 Emoji
    public String removeEmoji(String input) {
        return input.replaceAll("[^\\u0000-\\uFFFF]", "");
    }

验证是否解决

  1. 尝试插入包含 Emoji 的数据:

    INSERT INTO your_table(payer) VALUES ('测试 👑 表情');
  2. 检查数据是否正常存储

  3. 应用程序执行原操作,确认错误消失

重要提示:修改字符集后,确保所有相关表都转换为 utf8mb4,否则部分表仍可能出现类似错误。

通过以上步骤,即可彻底解决 Incorrect string value 错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值