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连接恢复正常。
问题原因
- 编码不匹配:报错中的
\x85\x8A\x8D\x95\x97是CP850编码下的特殊字符(àèìòù),但服务器被配置为按utf8mb4解析客户端发送的数据,将CP850字节流当作UTF-8解析,自然识别为无效字符,触发1366错误。 character-set-client-handshake配置冲突:设置该参数为FALSE时,MySQL会忽略客户端的字符集协商请求,强制使用配置文件中的character_set_client值。Windows控制台默认编码是CP850,客户端实际发送CP850编码字符串,服务器却按utf8mb4解析,导致不匹配。- JDBC版本差异:
mysql-connector-java-8.0.22的字符集协商逻辑更宽松,能自动适配客户端环境编码;而8.0.32版本严格遵循服务器配置,当编码不匹配时直接报错。 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=falseutf8mb4编码发送数据,与服务器配置一致。
3. 验证配置
执行插入语句后,查询表确认特殊字符正常显示:
select name from customer where id=1;
内容的提问来源于stack exchange,提问作者Michele Mariotti
相关产品推荐
相关产品推荐

