Gcloud环境下MySQL修改编码为utf8mb4后无法存储表情如何解决
1 确认字段级字符集是否全部生效
你执行的ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4理论上会批量更新表内所有字符串类型字段的编码,但如果某字段曾单独指定过字符集,可能出现表级配置生效、字段级仍为utf8的情况。
用以下命令校验目标字段的编码:
SHOW FULL COLUMNS FROM <替换为你的表名>;
如果对应字段的Collation字段不是utf8mb4开头的值,执行以下命令单独修改字段:
ALTER TABLE <表名> MODIFY <字段名> <原字段类型> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
2 调整JDBC连接的字符集参数
你当前使用Hibernate框架,依赖JDBC连接数据库,需要在JDBC连接URL中显式指定utf8mb4编码,否则连接会默认使用utf8传输数据,哪怕服务端已经改了编码也会报错。
修改连接URL为以下格式:jdbc:mysql://<你的GCloud MySQL实例地址>/<库名>?useUnicode=true&characterEncoding=utf8mb4
注意不要将characterEncoding参数值写为utf8,必须明确指定为utf8mb4
3 补全MySQL实例的全局编码配置
除了character_set_server之外,你还需要将以下全局系统变量也设置为utf8mb4相关值:
- character_set_client = utf8mb4
- character_set_connection = utf8mb4
- character_set_results = utf8mb4
- collation_connection = utf8mb4_unicode_ci
你可以用以下命令查看当前所有编码相关变量的配置:
SHOW VARIABLES WHERE Variable_name LIKE 'character\_set\_%' OR Variable_name LIKE 'collation%';
GCloud云MySQL需要在实例的「自定义数据库标志」配置页中添加上述参数,重启实例后才会全局生效,避免新建立的会话仍使用默认utf8配置。
4 (可选)检查存储引擎行格式限制
如果你的MySQL实例版本低于5.7,且表的行格式为COMPACT/REDUNDANT,可能存在utf8mb4字段的索引长度限制,虽然这个问题不会直接抛出你遇到的字符串值错误,但如果前面配置都排查完仍有问题,可以将表的行格式修改为DYNAMIC,同时确保innodb_large_prefix参数开启即可。
内容的提问来源于stack exchange,提问作者lisi1986

