修复Discuz 迁移后页面全部变成“????”乱码的问题

最近帮客户做一次老站迁移时,遇到一个典型但又容易误判的问题:

Discuz 论坛从 A 服务器迁移到 B 服务器后,前台页面全部变成"????"。

数据库正常,程序不报错,但所有中文标题、帖子内容全部变问号。

如果你也在做老站迁移,尤其是 Discuz 7 / GBK 站点,这篇文章应该能帮你少走弯路。

一、现象描述

迁移环境:

  • 原服务器:老 MySQL 环境

  • 新服务器:MariaDB 10.11(CloudLinux)

  • 程序:Discuz 7(GBK 版本)

  • 控制面板:cPanel

迁移完成后:

  • 网站可以访问

  • 后台可以进入

  • 数据库内容在 phpMyAdmin 里显示正常中文

  • 但前台页面全部变成问号乱码,如图:

二、第一步排查:数据库是否已经损坏?

这是最关键的一步。

进入 phpMyAdmin 执行:

SHOW CREATE DATABASE 数据库名;

SHOW TABLE STATUS LIKE 'cdb_threads';

结果显示:

  • 表 Collation = gbk_chinese_ci

  • 数据库是 GBK

  • 表数据中文正常

结论:

数据没有损坏,问题出在"连接字符集"。

三、问题根源分析

Discuz 7 是 2006 年的程序。

它默认使用:

$dbcharset = 'gbk';

$charset = 'gbk';

旧服务器环境:

  • MySQL 默认字符集 = GBK

  • 客户端连接默认 = GBK

  • 即使没有显式 SET NAMES 也能正常工作

新服务器(MariaDB 10.11):

  • 默认字符集 = utf8mb4

  • 客户端握手字符集 = utf8mb4

  • 但数据库表实际是 GBK

于是出现:

程序按 UTF8 解释 GBK 数据 → 全部变成 ????

这不是数据库损坏,而是字符集错位。

四、解决方案

打开:

include/db_mysql.class.php

找到 connect() 函数,在连接成功后加入:

mysql_query("SET NAMES gbk", $this->link);

完整位置示例:

serverset \&\& mysql_query("SET serverset", $this->link);

mysql_query("SET NAMES gbk", $this->link);

dbname \&\& @mysql_select_db(dbname, $this->link);

然后清理缓存:

forumdata/cache/*

forumdata/templates/*

刷新页面 ------ 问题立即恢复。

五、为什么 MariaDB 10.11 会触发这个问题?

这不是"MariaDB 不兼容 Discuz"。

而是:

  • 新版本数据库默认 UTF8

  • 老程序默认 GBK

  • 且老程序没有强制连接字符集

在现代环境下,老程序更容易暴露这种字符集问题。

六、如何避免再次踩坑?

1. 老 Discuz 迁移时必须确认:

  • 数据库真实字符集

  • 程序配置文件字符集

  • 是否执行了 SET NAMES

2. 导出数据库时带字符集参数:

mysqldump --default-character-set=gbk

3. 未来建议:

  • 将数据库统一转换为 UTF8

  • 升级到 Discuz X3.4

  • 避免继续使用 mysql_* 扩展

七、关于服务器环境的建议

这次迁移使用的是:

  • cPanel

  • CloudLinux

  • MariaDB 10.11

现代环境本身没有问题。

问题往往出现在:

老程序 + 旧编码(GBK) + 新数据库默认 UTF8

在 Hostease 这类支持自定义 PHP / MySQL 环境的服务器上,排查和调整会更方便,尤其在字符集和 SQL 模式方面。

八、总结

这次问题的本质:

不是数据库损坏

不是程序崩溃

而是连接字符集错位

只要数据还在,就可以修复。

如果你的网站迁移后出现"全是问号",第一时间检查字符集,而不是盲目重装或怀疑数据库损坏。

相关推荐
NineData1 天前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析
IvorySQL1 天前
双星闪耀温哥华:IvorySQL 社区两项议题入选 PGConf.dev 2026
数据库·postgresql·开源
ma_king1 天前
入门 java 和 数据库
java·数据库·后端
jiayou641 天前
KingbaseES 实战:审计追踪配置与运维实践
数据库
随风飘的云1 天前
mysql的innodb引擎对可重复读做了那些优化,可以避免幻读
mysql
NineData2 天前
NineData 迁移评估功能正式上线
数据库·dba
NineData2 天前
数据库迁移总踩坑?用 NineData 迁移评估,提前识别所有兼容性风险
数据库·程序员·云计算
赵渝强老师2 天前
【赵渝强老师】PostgreSQL中表的碎片
数据库·postgresql
全栈老石2 天前
拆解低代码引擎核心:元数据驱动的"万能表"架构
数据库·低代码
倔强的石头_3 天前
kingbase备份与恢复实战(二)—— sys_dump库级逻辑备份与恢复(Windows详细步骤)
数据库