You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MySQL 8.0.32插入特殊字符报错,客户端字符集问题求助

MySQL 8.0.32 插入特殊字符报错问题排查与解决

问题描述

Windows环境下将MySQL从5.7升级到8.0.32后,执行以下插入语句报错:

insert into customer (id, uuid, name) values (1,uuid(), 'àèìòù');

错误信息:

ERROR 1366 (HY000): Incorrect string value: '\x85\x8A\x8D\x95\x97' for column 'name' at row 1

  • 本地MySQL客户端执行、使用mysql-connector-j-8.0.32连接时均报错
  • 使用mysql-connector-java-8.0.22可正常执行
  • 数据表customer字符集为utf8mb4,数据库字符集相关变量也均配置为utf8mb4(具体配置见下方)

数据表配置

| customer | CREATE TABLE `customer` (
  `id` bigint NOT NULL,
  `uuid` char(36) NOT NULL,
  `name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UK_q8w2f8xfdoax44qc8w0epholu` (`uuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci |

字符集与排序规则变量

mysql> show variables like '%char%';
+--------------------------+------------------------------------------------------+
| Variable_name            | Value                                                |
+--------------------------+------------------------------------------------------+
| character_set_client     | utf8mb4                                              |
| character_set_connection | utf8mb4                                              |
| character_set_database   | utf8mb4                                              |
| character_set_filesystem | binary                                               |
| character_set_results    | utf8mb4                                              |
| character_set_server     | utf8mb4                                              |
| character_set_system     | utf8mb3                                              |
| character_sets_dir       | D:\shape\servers\mysql-8.0.32-winx64\share\charsets\ |
+--------------------------+------------------------------------------------------+
8 rows in set (0.00 sec)

mysql> show variables like '%collation%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | utf8mb4_0900_ai_ci |
| collation_database            | utf8mb4_0900_ai_ci |
| collation_server              | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set (0.00 sec)

临时执行set character_set_client=cp850;后可正常插入;注释my.ini中character-set-client-handshake = FALSE和init_connect='SET NAMES utf8mb4'配置后,JDBC连接恢复正常。

问题原因

  1. 编码不匹配:报错中的\x85\x8A\x8D\x95\x97是CP850编码下的特殊字符(àèìòù),但服务器被配置为按utf8mb4解析客户端发送的数据,将CP850字节流当作UTF-8解析,自然识别为无效字符,触发1366错误。
  2. character-set-client-handshake配置冲突:设置该参数为FALSE时,MySQL会忽略客户端的字符集协商请求,强制使用配置文件中的character_set_client值。Windows控制台默认编码是CP850,客户端实际发送CP850编码字符串,服务器却按utf8mb4解析,导致不匹配。
  3. JDBC版本差异:mysql-connector-java-8.0.22的字符集协商逻辑更宽松,能自动适配客户端环境编码;而8.0.32版本严格遵循服务器配置,当编码不匹配时直接报错。
  4. init_connect干扰:该配置会在连接初始化时强制设置字符集为utf8mb4,但客户端实际使用CP850编码,造成编码协商矛盾。

解决方案

1. 本地客户端正常使用UTF-8的配置

方法一:切换Windows控制台编码为UTF-8

打开命令提示符,先执行:

chcp 65001

将控制台编码切换为UTF-8(65001是UTF-8的代码页),再启动MySQL客户端。此时客户端发送的字符串为UTF-8编码,与服务器utf8mb4配置匹配,可正常插入特殊字符。

方法二:指定客户端启动字符集

启动MySQL客户端时,明确指定字符集为CP850,匹配Windows控制台默认编码:

mysql --default-character-set=cp850 -u root -p

服务器会按CP850解析客户端数据,再转换为utf8mb4存储。

2. 全局配置(适配JDBC与客户端)

调整my.ini配置:

  • 保留character-set-client-handshake = TRUE(默认值,可省略),允许MySQL与客户端正常协商字符集。
  • 移除init_connect='SET NAMES utf8mb4',避免强制覆盖客户端协商结果。
  • 确保核心字符集配置:
    [mysqld]
    character-set-server=utf8mb4
    collation-server=utf8mb4_0900_ai_ci
    
  • JDBC连接URL中明确指定字符集:
    jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=utf8mb4&useSSL=false
    
    驱动会以utf8mb4编码发送数据,与服务器配置一致。

3. 验证配置

执行插入语句后,查询表确认特殊字符正常显示:

select name from customer where id=1;

内容的提问来源于stack exchange,提问作者Michele Mariotti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 13:20:28