MySQL8通过JDBC操作时mysqlbinlog输出character_set_client=255解决方案问询
问题解决方案
根因说明
你遇到的character_set_client=255问题本质是:MySQL 8.0新增了utf8mb4_0900_ai_ci排序规则,该规则的内部ID在MySQL 5.7中不存在,所以5.7无法识别。MySQL原生客户端默认不会启用该新排序规则,而8.0版本的JDBC驱动默认会优先使用该规则,且如果JDBC连接账号持有SUPER权限,你配置的init_connect语句不会生效,最终导致binlog中写入了异常的编码ID。
方案1:JDBC连接配置调整(优先推荐)
在现有JDBC URL中追加2个强制编码规则的参数即可:
connectionCollation=utf8_bin:显式指定连接使用的排序规则,覆盖驱动默认的8.0新增排序规则characterSetResults=utf8:显式指定结果集返回编码
修改后的完整JDBC URL如下:
jdbc:mysql://localhost:63306/database?characterEncoding=utf8&connectionCollation=utf8_bin&characterSetResults=utf8
如果业务无需存储emoji等utf8mb4字符,还可以追加useUnicode=false参数进一步强制降级编码规则。
方案2:服务端配置补全
在你现有的my.cnf的[mysqld]段落追加2行配置:
# 忽略客户端发送的编码配置,强制使用服务端预设的utf8规则 skip-character-set-client-handshake # 强制utf8mb4的默认排序规则使用5.7兼容的版本 default_collation_for_utf8mb4=utf8mb4_general_ci
同时确认你用于JDBC连接的账号没有SUPER权限,持有SUPER权限的账号连接时会跳过init_connect语句的执行,要么移除账号的SUPER权限,要么在JDBC建立连接后手动执行一次SET NAMES utf8 COLLATE utf8_bin语句。
方案3:binlog导出后过滤(临时应急方案)
如果上述两个方案暂时无法调整,可以在导出binlog时通过管道直接过滤异常语句,命令如下:
mysqlbinlog --set-charset=utf8 [你的binlog文件名] | grep -v "SET @@session.character_set_client=255" | grep -v "/*!80011 SET @@session.default_collation_for_utf8mb4=255*/" > 可导入5.7的同步.sql
过滤后的SQL不会影响正常数据同步逻辑,可以直接导入MySQL 5.7实例。
内容的提问来源于stack exchange,提问作者linus
相关产品推荐
相关产品推荐

