如何在MySQL数据库中正确存储转换emoji、法语重音等非ASCII字符
问题根因
你遇到的报错和字符转换异常核心是两个问题:
- MySQL原生
utf8字符集实际为utf8mb3,仅支持最多3字节的字符,无法容纳4字节的emoji,所以第一条SQL转换时会清空包含emoji的行 - 第二条SQL未指定转换目标字符集为
utf8mb4,默认字符集不匹配法语重音字符的编码规则,触发1366错误
前置操作
首先全量备份wp_posts表,避免转换出错导致数据丢失,可执行命令备份:
CREATE TABLE wp_posts_bak AS SELECT * FROM wp_posts;
解决步骤
- 先设置当前会话字符集为utf8mb4,避免连接层字符集干扰
SET NAMES utf8mb4;
- 临时关闭当前会话的严格SQL模式,避免特殊字符校验阻断转换
SET SESSION sql_mode = '';
- 执行正确的全表转码命令,明确指定目标字符集为
utf8mb4
UPDATE wp_posts SET post_content = CONVERT(CAST(CONVERT(post_content USING latin1) AS BINARY) USING utf8mb4);
- 转换完成后验证数据:法语重音字符、emoji均正常显示后,恢复会话的SQL模式(可选,重启会话也会自动恢复)
SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
异常排查补充
如果转换后仍有异常,可以先查询单条包含特殊字符的内容编码,确认原始存储的编码格式:
SELECT HEX(post_content) FROM wp_posts WHERE post_content LIKE '%Noëlle%' LIMIT 1;
如果返回结果中ë对应的编码为C3AB,说明原始数据已经是正确的utf8mb4编码,仅需调整Adminer连接字符集为utf8mb4即可,无需执行转码操作。
后续配置校验
- 确认Adminer的连接字符集设置为
utf8mb4,避免显示层面的异常 - 检查WordPress配置文件
wp-config.php,确保存在以下配置,避免后续新写入数据再次出现编码问题:
define( 'DB_CHARSET', 'utf8mb4' ); define( 'DB_COLLATE', 'utf8mb4_general_ci' );
内容的提问来源于stack exchange,提问作者TerminalVelocity
相关产品推荐
相关产品推荐

