多站长的网站,如果发帖或者回复里有emoji表情的话,会出现其奇怪怪的问题,有的discuz版本会截断Emoji后面的字符,有的会降emoji变成问号,反正就是不正常显示,今天我们就是来解决这个问题的。
让 Discuz 论坛支持 Emoji 表情,需要从数据库编码、程序配置、字符过滤三个核心层面进行调整,以下是具体步骤(以 Discuz X3.4 为例,其他版本思路类似):
一、前提:确认服务器环境支持
Emoji 属于 4 字节 Unicode 字符(如😊对应U+1F60A),需依赖utf8mb4编码,因此需满足:
MySQL 版本 ≥ 5.5.3(utf8mb4编码从该版本开始支持);
PHP 版本 ≥ 5.4(确保 MySQLi 扩展支持utf8mb4);
二、核心步骤:修改数据库编码为 utf8mb4
Discuz 默认数据库编码为utf8(仅支持 3 字节 Unicode),无法存储 Emoji,需将数据库、表、字段统一改为utf8mb4。
1. 备份数据库(关键!)
修改编码前务必备份所有数据,避免乱码或数据丢失(可通过 Discuz 后台 “数据备份” 或 phpMyAdmin 导出)。
2. 修改数据库编码
登录 phpMyAdmin 或数据库管理工具,执行以下 SQL(将discuz_db替换为你的数据库名):
ALTER DATABASE discuz_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3. 修改核心表及字段编码
Discuz 中存储内容(如帖子、回复、用户名、签名等)的表需要修改,关键表包括:
pre_forum_post(帖子内容)
pre_forum_thread(主题标题 / 内容)
pre_common_member(用户名 / 签名)
pre_common_member_profile(个人资料)
以pre_forum_post为例,执行 SQL(其他表同理)
修改表编码
ALTER TABLE pre_forum_post CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
单独确认字段(如消息内容字段`message`)
ALTER TABLE pre_forum_post CHANGE message message TEXT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
三、调整 Discuz 程序配置
1. 修改数据库连接编码
打开 Discuz 根目录的config/config.inc.php,找到数据库配置部分,添加charset参数为utf8mb4:
$db = array ( '1' => array ( 'dbhost' => 'localhost', 'dbuser' => '你的数据库用户名', 'dbpw' => '你的数据库密码', 'dbname' => 'discuz_db', 'dbcharset' => 'utf8mb4', // 新增/修改为utf8mb4 'pconnect' => '0', 'tablepre' => 'pre_', ), );>
>补充一条优化标题的sql语句
修改表编码
ALTER TABLE `pre_forum_thread` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
单独确认subject字段(若表修改后仍无效)
ALTER TABLE `pre_forum_thread` CHANGE `subject` `subject` VARCHAR(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL;
