[color=rgb(80, 90, 100)][font="]现在Emoji 已逐渐普及,尤其手机用户使用Emoji 的频率也越来越高
[color=rgb(80, 90, 100)][font="]不过传统的UTF 8 编码资料库无法储存Emoji 符号,所以常常造成内容输入后表情变空白的问题,
[color=rgb(80, 90, 100)][font="]Discuz 本身是讨论区,又只有UTF 8 编码能使用,实在是不完美,所以就只好自己手动修改了~
[color=rgb(80, 90, 100)][font="]
图片:讓 Discuz! 支持 Emoji 表情符號.png

[color=rgb(80, 90, 100)][font="]进入正题XD
[color=rgb(80, 90, 100)][font="] 1. 注意事项
[color=rgb(80, 90, 100)][font="]要将Discuz 编码修改成utf8mb4 其实不难,不过要花上一些时间,
[color=rgb(80, 90, 100)][font="]最重要的是MySQL的版本最低需求5.5.3才支援utf8mb4编码。
2. 修改Config
[color=rgb(80, 90, 100)][font="]首先要修改的就是config档案,如果是全新安装的可以直接修改 config/config_global_default.php、config/config_ucenter_default.php两个档案,
[color=rgb(80, 90, 100)][font="]如果是已安装(论坛已运作中)的则是修改 config/config_global.php、config/config_ucenter.php两个档案。
[color=rgb(80, 90, 100)][font="]开启config_global_default.php修改第38行的 dbcharset为 utf8mb4:
$_config['db'][1]['dbcharset'] = 'utf8mb4';
[color=rgb(80, 90, 100)][font="]开启 config_ucenter.php修改第17行的UC_DBCHARSET:
define('UC_DBCHARSET', 'utf8mb4');
[color=rgb(51, 51, 51)][font="]已运作中的论坛需多修改一个档案!
[color=rgb(80, 90, 100)][font="]开启uc_server/data/config.inc.php,修改第6行的UC_DBCHARSET:
define('UC_DBCHARSET', 'utf8mb4');
3. 修改资料库编码
[color=rgb(80, 90, 100)][font="]如果是全新安装的,修改 install/index.php,找到第375行:
runquery($sql);
[color=rgb(80, 90, 100)][font="]上方加上:
runquery('ALTER DATABASE '.$dbname.' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;');
[color=rgb(80, 90, 100)][font="]如此一来安装资料表时资料库就会一并修改为 utf8mb4 编码,如果建立资料库时已设定好编码可以忽略此步骤。
4. 修改预设编码
[color=rgb(80, 90, 100)][font="]如果是全新安装的,还需要修改 install/include/install_var.php第27行的DBCHARSET:
define([color=rgb(221, 17, 68)]'DBCHARSET', [color=rgb(221, 17, 68)]'utf8mb4');5. 修改资料库栏位长度[color=rgb(80, 90, 100)][font="]修改到这边就差不多了,不过这时候如果直接进行安装,在安装过程中会出现大量以下错误:
[color=rgb(80, 90, 100)][font="]这是因为编码之间的差异差异导致字节计算数量超出范围的关系。
[color=rgb(80, 90, 100)][font="]简单说就是Discuz本身是针对UTF 8编码来建立资料库,但修改为utf8mb4后,预设建立的SQL有部分栏位所定义的主键字节长度超出了可使用的范围,详情可以[color=rgb(39, 114, 219)]见此说明。
[color=rgb(80, 90, 100)][font="]Discuz 所使用的资料库引擎是MyISAM,MyISAM 可使用的主键长度是1000 字节,UTF 8 每个文字占用3 字节、utf8mb4 占用4 字节,
[color=rgb(80, 90, 100)][font="]而Discuz 预设建立的SQL 中,部分主键定义的长度是VARCHAR(255),在UTF 8 下255*3=765 < 1000,但 utf8mb4 下255*4=1020 > 1000,所以会产生错误,
[color=rgb(80, 90, 100)][font="]这时只能手动将预设SQL档案做修改,将主键定义长度修改为1000/4 = 250(不过250似乎还是错误所以取249),需要修改的档案有install/data/install.sql、uc_server/install/uc.sql,
[color=rgb(80, 90, 100)][font="]修改过程有点麻烦,我自己使用的方式如下:
[*]搜寻关键字255
[*]查看定义255 长度的栏位有没有被定义成主键
[*]有的话就把该栏位长度修改成249
[color=rgb(80, 90, 100)][font="]40 行、153 行、292 行、295 行、322 行、330 行、901 行、926 行、945 行、1269 行、2391 行、3464 行、3805 行、4008 行
uc.sql 总共修改1 处:[color=rgb(80, 90, 100)][font="]123 行
6. 完成
[color=rgb(80, 90, 100)][font="]到这边编码修改步骤就全部完成,直接安装应该就能顺利完成了,而且在论坛内任何地方发表时也都可以使用Emoji 啰!
运作中的论坛?
[color=rgb(80, 90, 100)][font="]至于如果是Discuz 已经安装完成,但也想要直接修改的人呢,除了要修改步骤2 之外,
[color=rgb(80, 90, 100)][font="]可以直接到资料库管理中心(通常是phpMyAdmin),请先对照步骤5 要修改的SQL 资料表栏位有哪些(请自行先备份资料库),
[color=rgb(80, 90, 100)][font="]手动修改栏位长度,例如install.sql第40行修改的是 pre_common_admincp_perm的 perm栏位:
[color=rgb(80, 90, 100)][font="]进入资料表,切换到「结构」,找到栏位后,点击[ 修改 ]
[color=rgb(80, 90, 100)][font="]将长度修改为249后按[ 储存 ]
[color=rgb(80, 90, 100)][font="]将总共​​14+1 个地方全部修改完毕即可。
修改资料库编码
[color=rgb(80, 90, 100)][font="]接着回到资料库,点击[ 操作 ],找到编码与排序后选择 utf8mb4_general_ci,点击[ 执行 ]
[color=rgb(80, 90, 100)][font="]如此一来资料库编码就修改完成。
修改资料表编码
[color=rgb(80, 90, 100)][font="]这部分比较麻烦一点,不过有个偷懒的方式可以批次修改([color=rgb(39, 114, 219)]来源),首先到资料库中切换到[ SQL ],输入指令SHOW TABLES; 并执行:
[color=rgb(80, 90, 100)][font="]执行后就会看到所有的资料表名称,把页面拉到最下方去,点击[ 复制到剪贴簿 ]
[color=rgb(80, 90, 100)][font="]开启[color=rgb(39, 114, 219)]NimbleText,把东西直接贴到 For each row in this list下方的框框内,不过上面的说明和空白部分都不要,所以把它删除
[color=rgb(80, 90, 100)][font="]接着在下方的 Substitute using this pattern框框内贴上:
ALTER TABLE `$0` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
[color=rgb(80, 90, 100)][font="]恭喜!你成功的执行了懒人步骤,赶快把下方 Results 里的内容全部复制起来
[color=rgb(80, 90, 100)][font="]再次进入资料库的SQL指令页面,把复制的东西全部贴进去,按下[ 执行 ]
[color=rgb(80, 90, 100)][font="]大功告成~










