12下一页
返回列表 发新帖
查看: 277|回复: 18

Discuz X3.4修改数据库为utf8mb4编码支持Emoji方法教程

[复制链接]

196

热度

29

元宝

341

贡献

终身ViP

发表于 2018-9-10 11:25:07 | 显示全部楼层 |阅读模式
现在Emoji 已逐渐普及,尤其手机用户使用Emoji 的频率也越来越高
不过传统的UTF 8 编码资料库无法储存Emoji 符号,所以常常造成内容输入后表情变空白的问题,
Discuz 本身是讨论区,又只有UTF 8 编码能使用,实在是不完美,所以就只好自己手动修改了~
讓 Discuz! 支持 Emoji 表情符號.png
进入正题XD
1. 注意事项
这里将以修改「全新安装」版本的方式来做范例,可以到Discuz官网下载最新安装包
要将Discuz 编码修改成utf8mb4 其实不难,不过要花上一些时间,
最重要的是mysql的版本最低需求5.5.3才支援utf8mb4编码。

2. 修改Config
首先要修改的就是config档案,如果是全新安装的可以直接修改  config/config_global_default.php、config/config_ucenter_default.php两个档案,
如果是已安装(论坛已运作中)的则是修改  config/config_global.php、config/config_ucenter.php两个档案。
开启config_global_default.php修改第38行的  dbcharset为  utf8mb4:
  1. $_config['db'][1]['dbcharset'] = 'utf8mb4';
复制代码

开启  config_ucenter.php修改第17行的UC_DBCHARSET:
  1. define('UC_DBCHARSET', 'utf8mb4');
复制代码

已运作中的论坛需多修改一个档案!
开启uc_server/data/config.inc.php,修改第6行的UC_DBCHARSET:
  1. define('UC_DBCHARSET', 'utf8mb4');
复制代码

3. 修改资料库编码
如果是全新安装的,修改  install/index.php,找到第375行:
  1. runquery($sql);
复制代码

上方加上:
  1. runquery('ALTER DATABASE '.$dbname.' CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;');
复制代码

如此一来安装资料表时资料库就会一并修改为 utf8mb4 编码,如果建立资料库时已设定好编码可以忽略此步骤。

4. 修改预设编码
如果是全新安装的,还需要修改  install/include/install_var.php第27行的DBCHARSET:
define('DBCHARSET', 'utf8mb4');5. 修改资料库栏位长度
修改到这边就差不多了,不过这时候如果直接进行安装,在安装过程中会出现大量以下错误:
这是因为编码之间的差异差异导致字节计算数量超出范围的关系。
简单说就是Discuz本身是针对UTF 8编码来建立资料库,但修改为utf8mb4后,预设建立的SQL有部分栏位所定义的主键字节长度超出了可使用的范围,详情可以见此说明
Discuz 所使用的资料库引擎是MyISAM,MyISAM 可使用的主键长度是1000 字节,UTF 8 每个文字占用3 字节、utf8mb4 占用4 字节,
而Discuz 预设建立的SQL 中,部分主键定义的长度是VARCHAR(255),在UTF 8 下255*3=765 < 1000,但 utf8mb4 下255*4=1020 > 1000,所以会产生错误,
这时只能手动将预设SQL档案做修改,将主键定义长度修改为1000/4 = 250(不过250似乎还是错误所以取249),需要修改的档案有install/data/install.sql、uc_server/install/uc.sql,
修改过程有点麻烦,我自己使用的方式如下:
  • 搜寻关键字255
  • 查看定义255 长度的栏位有没有被定义成主键
  • 有的话就把该栏位长度修改成249
X3.3 版本,install.sql 总共修改14 处:
40 行、153 行、292 行、295 行、322 行、330 行、901 行、926 行、945 行、1269 行、2391 行、3464 行、3805 行、4008 行
uc.sql 总共修改1 处:
123 行

6. 完成
到这边编码修改步骤就全部完成,直接安装应该就能顺利完成了,而且在论坛内任何地方发表时也都可以使用Emoji 啰!

运作中的论坛?
至于如果是Discuz 已经安装完成,但也想要直接修改的人呢,除了要修改步骤2 之外,
可以直接到资料库管理中心(通常是phpMyAdmin),请先对照步骤5 要修改的SQL 资料表栏位有哪些(请自行先备份资料库),
手动修改栏位长度,例如install.sql第40行修改的是  pre_common_admincp_perm的  perm栏位:
进入资料表,切换到「结构」,找到栏位后,点击[ 修改 ]

将长度修改为249后按[ 储存 ]

将总共&#8203;&#8203;14+1 个地方全部修改完毕即可。

修改资料库编码
接着回到资料库,点击[ 操作 ],找到编码与排序后选择  utf8mb4_general_ci,点击[ 执行 ]
如此一来资料库编码就修改完成。

修改资料表编码
这部分比较麻烦一点,不过有个偷懒的方式可以批次修改(来源),首先到资料库中切换到[ SQL ],输入指令SHOW TABLES; 并执行:

执行后就会看到所有的资料表名称,把页面拉到最下方去,点击[ 复制到剪贴簿 ]

开启NimbleText,把东西直接贴到  For each row in this list下方的框框内,不过上面的说明和空白部分都不要,所以把它删除

接着在下方的  Substitute using this pattern框框内贴上:
  1. ALTER TABLE `$0` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
复制代码

恭喜!你成功的执行了懒人步骤,赶快把下方  Results  里的内容全部复制起来

再次进入资料库的SQL指令页面,把复制的东西全部贴进去,按下[ 执行 ]

大功告成~


热度

元宝

贡献

步入草根

发表于 2025-11-29 13:05:44 | 显示全部楼层
支持楼主

热度

元宝

贡献

步入草根

发表于 2025-12-8 07:00:05 | 显示全部楼层
我来看看怎么个事儿

4

热度

8

元宝

0

贡献

步入草根

发表于 2025-12-10 16:42:39 | 显示全部楼层
我来看看怎么个事儿

0

热度

2

元宝

0

贡献

步入草根

发表于 2025-12-17 11:31:04 | 显示全部楼层
支持楼主

热度

元宝

贡献

步入草根

发表于 2025-12-31 18:37:36 | 显示全部楼层
看看

热度

元宝

贡献

步入草根

发表于 2026-1-1 17:07:48 | 显示全部楼层
支持一下

热度

元宝

贡献

步入草根

发表于 2026-1-1 21:43:17 | 显示全部楼层
6666666

热度

元宝

贡献

步入草根

发表于 2026-1-4 01:08:55 | 显示全部楼层
6666666

热度

元宝

贡献

步入草根

发表于 2026-1-5 17:18:55 | 显示全部楼层
6666666
下一页 »
12下一页
返回列表 发新帖
 懒得打字嘛,点击右侧快捷回复【最新发布】   【赞助草根吧享更多权益】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

收藏帖子 返回列表 搜索

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

小黑屋|手机版|草根吧