Skip to content
Go back

解决 MySQL 数据库数据出现乱码的问题

| 0 Views Edit page

针对 MySQL 检索出现类似 {'name': '测试分类', 'description': '测试分类的æ\x8f\x8fè¿°', 'order': '99', 'seo_title': 'SEO æ\xa0‡é¢˜', 'seo_metakey': 'SEO 关键è¯\x8d一ã€\x81关键è¯\x8d2', 'seo_desc': 'SEO æ\x8f\x8fè¿°'} 的乱码进行修复。


1、错误现象

在 GitHub Action 的环境中启动了 MySQL 容器,插入了数据:

INSERT INTO `wp_terms` (`term_id`, `name`, `slug`, `term_group`) VALUES ('2', '测试分类', 'test_favorite', '0');
INSERT INTO `wp_termmeta` (`meta_id`, `term_id`, `meta_key`, `meta_value`) VALUES ('2', '2', 'seo_title', 'SEO 标题');
INSERT INTO `wp_termmeta` (`meta_id`, `term_id`, `meta_key`, `meta_value`) VALUES ('3', '2', 'seo_metakey', 'SEO 关键词一、关键词2');
INSERT INTO `wp_termmeta` (`meta_id`, `term_id`, `meta_key`, `meta_value`) VALUES ('4', '2', 'seo_desc', 'SEO 描述');

之后通过 Python 检索的时候,就成了:

{'name': '测试分类', 'slug': 'test_favorite', 'parent': 0, 'description': '测试分类的æ\x8f\x8fè¿°', 'order': '99', 'seo_title': 'SEO æ\xa0‡é¢˜', 'seo_metakey': 'SEO 关键è¯\x8d一ã€\x81关键è¯\x8d2', 'seo_desc': 'SEO æ\x8f\x8fè¿°', 'card_mode': 'null', 'columns_type': 'global', 'columns': 'a:5:{s:2:"sm";s:1:"2";s:2:"md";s:1:"2";s:2:"lg";s:1:"3";s:2:"xl";s:1:"5";s:3:"xxl";s:1:"6";}', '_term_id': 2, '_term_taxonomy_id': 2}

这在本地并未发生过,因此猜测是数据库默认编码不支持中文导致的。

2、解决办法

先确认下是否是由数据库编码引起的,进入数据库:

docker exec -it mysql /bin/bash
mysql -u root -p

检索下编码相关的变量 character%

show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)

果然都是不支持中文 latin1 编码格式,退出 MySQL 命令行接着去修改下配置文件:

# 退出 MySQL 命令行
quit

/etc/my.cnf 文件下面加上两行:

echo "[mysql]" >> /etc/my.cnf
echo "default-character-set=utf8mb4" >> /etc/my.cnf

之后退出并重启容器即可。
重新插入数据,再检索就正常了:

{'name': '测试分类', 'slug': 'test_favorite', 'parent': 0, 'description': '测试分类的描述', 'order': '99', 'seo_title': 'SEO 标题', 'seo_metakey': 'SEO 关键词一、关键词2', 'seo_desc': 'SEO 描述', 'card_mode': 'null', 'columns_type': 'global', 'columns': 'a:5:{s:2:"sm";s:1:"2";s:2:"md";s:1:"2";s:2:"lg";s:1:"3";s:2:"xl";s:1:"5";s:3:"xxl";s:1:"6";}', '_term_id': 2, '_term_taxonomy_id': 2}

参考资料:


Edit page