让 Discuz! 支持 Emoji 表情符号,以 utf8mb4 取代 UTF-8 版本
现在 Emoji 已逐渐普及,尤其手机用户使用 Emoji 的频率也越来越高 不过传统的 UTF 8 编码数据库无法储存 Emoji 符号,所以常常造成内容输入后表情变空白的问题, Discuz 本身是讨论区,又只有 UTF 8 编码能使用,实在是不完美,所以就只好自己手动修改了~
以下所有修改信息以DZ3.4版本为例
Discuz 身为国内最大的论坛提供商,又是腾讯旗下的公司管理开发的,却一直保持摆烂状态, 虽然 X3.4 已经开源了,不过 Issue 没在处理,PR 除非是比较大的漏洞也很少在合并, 新功能不太想加,https 不想支持,编辑器的坑太深所以 Bug 也索性不管了,通通只能自己来,叹气~
注意事项
这里将以修改「全新安装」版本的方式来做范例,可以到 Discuz 官网下载最新安装包, 要将 Discuz 编码修改成 utf8mb4 其实不难,不过要花上一些时间, 最重要的是 MySQL 的版本最低需求 5.5.3 才支持 utf8mb4 编码。
修改 Config
首先要修改的就是 config 文件,如果是全新安装的可以直接修改 config/config_global_default.php
、config/config_ucenter_default.php
两个文件,如果是已安装(论坛已运作中)的则是修改 config/config_global.php
、config/config_ucenter.php
两个文件。
修改第 38 行的 dbcharset 为 utf8mb4
$_config['db'][1]['dbcharset'] = 'utf8mb4';
编辑 uc_server/data/config.inc.php,修改第 6 行的 UC_DBCHARSET:
define('UC_DBCHARSET', 'utf8mb4');
备份数据库修改编码
使用 notepad++,替换一下备份的数据文件即可
varchar(255) 字符全部替换为 varchar(243)
char(255) 字符全部替换为 char(243)
(6 + 255) * 4 > 1000 ,超过1000 ,故用(243)
'utf8' 字符全部替换为 'utf8mb4' (注意带'号,不是替换utf-8)
数据库备份的sql文件,需要 全部 替换。
然后重装论坛,恢复数据库即可。
全新安装
1.如果是全新安装的,修改 install/index.php,找到第 375 行左右:
runquery($sql);
上方加上:
runquery('ALTER DATABASE '.$dbname.' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;');
如此一来安装数据表时数据库就会一并修改为 utf8mb4 编码,如果建立数据库时已设定好编码可以忽略此步骤。
2.修改预设编码
如果是全新安装的,还需要修改 install/include/install_var.php 第 27 行的 DBCHARSET:
define('DBCHARSET', 'utf8mb4');
3.修改数据库字段长度
修改到这边就差不多了,不过这时候如果直接进行安装,在安装过程中会出现大量以下错误:
这是因为编码之间的差异差异导致字节计算数量超出范围的关系。
简单说就是Discuz本身是针对UTF 8编码来建立数据库,但修改为 utf8mb4 后,默认建立的 SQL 有部分字段所定义的主键字节长度超出了可使用的范围,详情可以见此说明。
Discuz 所使用的数据库引擎是 MyISAM,MyISAM 可使用的主键长度是 1000 字节,UTF 8 每个文字占用 3 字节、utf8mb4 占用 4 字节,
而 Discuz 默认建立的 SQL 中,部分主键定义的长度是 VARCHAR(255),在 UTF 8 下 2553=765 < 1000,但 utf8mb4 下 2554=1020 > 1000,所以会产生错误,
这时只能手动将默认 SQL 文件做修改,将主键定义长度修改为 1000/4 = 250(不过 250 似乎还是错误所以取 249),需要修改的档案有 install/data/install.sql、uc_server/install/uc.sql, 修改过程有点麻烦,我自己使用的方式如下: 搜寻关键字 255 查看定义 255 长度的字段有没有被定义成主键 有的话就把该字段长度修改成 249