MySQL数据库字符集乱码,CMS中文乱码修复

网站突然出现中文乱码,比如文章变成问号或方块,通常和MySQL数据库字符集设置有关。
本文针对MySQL数据库字符集乱码和CMS中文乱码修复,从排查到修复一步步说明,适合刚接触服务器运维的站长。
跟着操作,你能定位乱码根源,完成字符集调整,并验证中文正常显示。

先确认乱码出现在哪个环节

乱码可能来自数据库存储、数据库连接或CMS程序输出。
建议先访问网站前台,查看乱码具体位置。
如果数据库中原本正常的中文变成乱码,说明存储或连接字符集有问题;
如果数据库正常但网页乱码,可能是CMS模板或输出编码问题。

登录MySQL,用以下命令查看当前字符集设置:

SHOW VARIABLES LIKE 'character_set%';
SHOW VARIABLES LIKE 'collation%';

重点看character_set_databasecharacter_set_server
如果它们不是utf8mb4,而你的CMS使用UTF-8,就可能出现乱码。
另外,检查CMS配置文件中的数据库连接字符集,比如WordPress的wp-config.php中是否有define('DB_CHARSET', 'utf8mb4');

修改MySQL服务端字符集

如果MySQL服务端字符集不是utf8mb4,需要修改配置文件。
以Linux下MySQL 5.7/8.0为例,配置文件通常是/etc/my.cnf/etc/mysql/my.cnf

用编辑器打开配置文件,在[mysqld]段落下添加:

[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

如果已有相关配置,修改为上述值。
保存后重启MySQL服务:

systemctl restart mysqld

或者使用宝塔面板:进入“软件商店” -> “MySQL” -> “设置” -> “配置修改”,添加上述参数后保存并重启。

重启后再次执行SHOW VARIABLES LIKE 'character_set%';
确认character_set_servercharacter_set_database已变为utf8mb4

调整数据库、表和字段的字符集

即使服务端字符集正确,已有的数据库、表和字段可能还是旧的字符集。
需要逐一修改。
先查看数据库字符集:

SELECT default_character_set_name FROM information_schema.SCHEMATA WHERE schema_name = '你的数据库名';

如果不是utf8mb4,执行:

ALTER DATABASE 你的数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

然后修改表和字段。
可以生成批量修改语句:

SELECT CONCAT('ALTER TABLE ', table_name, ' CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;') FROM information_schema.TABLES WHERE table_schema = '你的数据库名' AND table_collation != 'utf8mb4_unicode_ci';

将查询结果复制出来执行。
注意:操作前务必先备份数据库,避免数据丢失。

检查并修正CMS连接字符集

CMS程序连接数据库时,如果未指定字符集,可能沿用服务端默认值。
以常见CMS为例:

  • WordPress:在wp-config.php中确保有define('DB_CHARSET', 'utf8mb4');define('DB_COLLATE', '');
  • 织梦DedeCMS:在data/common.inc.php中检查$cfg_db_language是否为utf8
  • 帝国CMS:在e/config/config.php中查看$ecms_config['db']['setchar']是否为utf8

如果CMS有后台设置,比如“系统”->“数据库”->“字符集”,也需调整为utf8mb4。
修改后,清除CMS缓存,重新访问页面。

避坑指南与效果验证

修复过程中容易踩坑:

  • 备份优先:任何修改数据库字符集的操作前,必须用mysqldump或宝塔面板备份,防止数据损坏。
  • 连接字符集:即使数据库是utf8mb4,如果连接字符集不是utf8mb4,仍可能乱码。可以在CMS连接数据库后执行SET NAMES utf8mb4;,或确保程序配置正确。
  • 旧数据转换ALTER TABLE ... CONVERT TO CHARACTER SET会重新编码数据,如果原数据已经是乱码,转换后可能无法恢复。建议先修复乱码数据再转换。
  • 验证方法:在数据库中插入一条中文记录,然后通过CMS前台查看是否正常显示。也可以直接用SELECT查询,确认中文没有变成问号。

完成以上步骤后,乱码问题通常能解决。
如果个别页面仍乱码,检查模板文件编码是否为UTF-8无BOM。

常见疑问

修改字符集会影响现有数据吗?
执行ALTER TABLE ... CONVERT TO CHARACTER SET会重建表并转换数据,可能改变数据存储格式。务必先备份,并在测试环境验证。

为什么数据库正常但网页还是乱码?
可能是CMS模板文件编码错误,或者PHP输出头未指定UTF-8。检查模板文件保存为UTF-8,并在PHP文件开头添加header('Content-Type: text/html; charset=utf-8');

宝塔面板如何快速修改MySQL字符集?
在宝塔面板“软件商店”找到MySQL,点击“设置”->“配置修改”,添加character-set-server=utf8mb4,保存后重启MySQL。

修复后部分中文显示为问号怎么办?
说明部分数据在转换前已损坏。尝试从备份恢复,或使用CONVERT(BINARY CONVERT(column USING latin1) USING utf8mb4)等语句修复,但成功率有限,建议平时做好备份。

分享到:
上一篇
MySQL用户权限管理,禁止root远程登录
下一篇
Redis缓存过期策略,适配CMS动态站点
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意