修复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 模式方面。

八、总结

这次问题的本质:

不是数据库损坏

不是程序崩溃

而是连接字符集错位

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

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

相关推荐
倔强的石头_1 小时前
聊聊金仓KFS:一款把数据同步软件做扎实的产品
数据库
闲云野鹤在人间2 小时前
MySQL|从理论、安装、备份到主从复制、MHA高可用详解
linux·运维·数据库·mysql·云计算
禾小西2 小时前
Redis:从两大维度和三大主线建立知识体系
数据库·redis·缓存
禾小西2 小时前
Redis 数据结构:快速的 Redis 有哪些慢操作?
数据结构·数据库·redis
数据库小学妹3 小时前
数据共享交换平台选型:交换方式对比与避坑指南
数据库·信创·数据同步·数据交换平台·政务数据共享·数据共享交换平台·数据库底座
要开心吖ZSH3 小时前
MySQL 慢 SQL 排查操作手册-个人笔记版
java·笔记·sql·mysql·慢查询
loong_XL4 小时前
决策模型做内容安全检测:从踩坑到上线
数据库·安全·jev·决策模型
这个DBA有点耶4 小时前
数据库双轨并行实战:全量并行策略、增量延迟控制、双向回切与一致性校验
数据库·架构·dba
Gl�ria5 小时前
MySQL 单机版 vs 高可用版:宕机排查 + 故障处理
mysql·adb·架构
adinnet20265 小时前
保单、赔付与渠道问数:保险经营数据如何实现按需查询
大数据·数据库·人工智能