无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 17152|回复: 52
打印 上一主题 下一主题

[分享] discuzX3.4数据库改用utf8mb4字符集,实现emoji表情符

    [复制链接]
跳转到指定楼层
#
发表于 2018-5-26 17:27:44 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式
discuzX 3.4 默认字符集是utf8,安装后无法发一些表情符,也不能用表情符当用户名。

现在做测试改成 utf8mb4

测试机环境
centos 7.5
mysql 8.0.11
php 7.2.5
apache 2.4.6

一、全新安装

下载补丁文件,替换加入到discuzX 3.4 2018.01.01官方原版文件中,即可完成安装。

patch_utf8mb4.zip (47.35 KB, 下载次数: 105)

二、换服务器升级安装(内容更新中)

1.导出旧空间上数据库的表结构文件struct.sql 和 数据文件data.sql  
  1. mysqldump -d -u root -p$mysqlpass bbs > struct.sql
  2. mysqldump -t -u root -p$mysqlpass bbs --default-character-set=UTF8 > data.sql
复制代码


2.修改表结构文件 struct.sql,

_ci结尾的校对集大小写不敏感,即不区分大小写,ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的.
凡是在以前导入中提示 ERROR 1062 (23000): Duplicate entry 'xxxx' for key 'username' 之类的提示,往往出在选用不当的校对集引起的。
本次升级调试时使用了_ci的校对集,就遇到这个问题,象 'Avaloń' 与 'avalon' 被认为是重复,导致导入失败。

校对集 COLLATE=utf8mb4_bin 是区分大小写,可以防止旧库中有KEY属性的论坛用户名ABC、abc导入时被认为是重复的问题。

修改struct.sql

DEFAULT CHARSET=gbk 全部改成 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
varchar(255) 修改值
char(255) 修改值

callsed 文件内容
  1. /^CREATE TABLE `pre_common_addon`/,/^) ENGINE=MyISAM/s/`key` varchar(255)/`key` varchar(250)/
  2. /^CREATE TABLE `pre_common_admincp_perm`/,/^) ENGINE=MyISAM/s/`perm` varchar(255)/`perm` varchar(244)/
  3. /^CREATE TABLE `pre_common_advertisement_custom`/,/^) ENGINE=MyISAM/s/`name` varchar(255)/`name` varchar(250)/
  4. /^CREATE TABLE `pre_common_cache`/,/^) ENGINE=MyISAM/s/`cachekey` varchar(255)/`cachekey` varchar(250)/
  5. /^CREATE TABLE `pre_common_card`/,/^) ENGINE=MyISAM/s/`id` char(255)/`id` char(250)/
  6. /^CREATE TABLE `pre_common_member_profile_setting`/,/^) ENGINE=MyISAM/s/`fieldid` varchar(255)/`fieldid` varchar(250)/
  7. /^CREATE TABLE `pre_common_member_security`/,/^) ENGINE=MyISAM/s/`fieldid` varchar(255)/`fieldid` varchar(242)/
  8. /^CREATE TABLE `pre_common_setting`/,/^) ENGINE=MyISAM/s/`skey` varchar(255)/`skey` varchar(250)/
  9. /^CREATE TABLE `pre_forum_groupfield`/,/^) ENGINE=MyISAM/s/`type` varchar(255)/`type` varchar(242)/
  10. /^CREATE TABLE `pre_home_favorite`/,/^) ENGINE=MyISAM/s/`idtype` varchar(255)/`idtype` varchar(232)/
  11. /^CREATE TABLE `pre_mobile_setting`/,/^) ENGINE=MyISAM/s/`skey` varchar(255)/`skey` varchar(250)/
  12. /^CREATE TABLE `pre_portal_topic`/,/^) ENGINE=MyISAM/s/`name` varchar(255)/`name` varchar(250)/
  13. /^CREATE TABLE `cdb_uc_badwords`/,/^) ENGINE=MyISAM/s/`find` varchar(255)/`find` varchar(250)/
  14. s/DEFAULT CHARSET=gbk/DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin/
复制代码


在linux shell 下执行以下命令进行替换
  1. sed -i -f callsed struct.sql
复制代码


也可以在mysql 命令行下先修改原库(注意先备份数据库)

  1. USE bbs;

  2. ALTER TABLE `pre_common_addon` MODIFY COLUMN `key` varchar(250);
  3. ALTER TABLE `pre_common_admincp_perm` MODIFY COLUMN `perm` varchar(244);
  4. ALTER TABLE `pre_common_advertisement_custom` MODIFY COLUMN `name` varchar(250);
  5. ALTER TABLE `pre_common_cache` MODIFY COLUMN `cachekey` varchar(250);
  6. ALTER TABLE `pre_common_card` MODIFY COLUMN `id` char(250);
  7. ALTER TABLE `pre_common_member_profile_setting` MODIFY COLUMN `fieldid` varchar(250);
  8. ALTER TABLE `pre_common_member_security` MODIFY COLUMN `fieldid` varchar(242);
  9. ALTER TABLE `pre_common_setting` MODIFY COLUMN `skey` varchar(250);
  10. ALTER TABLE `pre_forum_groupfield` MODIFY COLUMN `type` varchar(242);
  11. ALTER TABLE `pre_home_favorite` MODIFY COLUMN `idtype` varchar(232);
  12. ALTER TABLE `pre_mobile_setting` MODIFY COLUMN `skey` varchar(250);
  13. ALTER TABLE `pre_portal_topic` MODIFY COLUMN `name` varchar(250);
  14. ALTER TABLE `cdb_uc_badwords` MODIFY COLUMN `find` varchar(250);
复制代码


3.在新空间的 mysql命令行下,导入struct.sql 和 数据文件data.sql  

  1. USE bbs;
  2. SOURCE struct.sql;
  3. SOURCE data.sql
复制代码


4.恢复旧空间的web数据库到新空间上,修改以下文件,将第一次出现连接库的'gbk' 改为 'utf8mb4'.每个文件只改一处。
config/config_global.php
config/config_global.php
uc_server/data/config.inc.php

5.按官方升级要求,上传官方版文件替换,进后台 > 工具 > 更新缓存。
另外还有source/class/table/下面三个文件需要更新,具体见本帖上方发的全新安装补丁包中提取。
table_common_usergroup.php
table_forum_announcement.php
table_forum_forum.php

6.界面 > 编辑器设置 > Discuz!代码,删除那些不可用的标签,可解决因使用Discuz标签而导致帖子内容无法正常显示的问题。

7.升级安装成功

目前仍存在问题:编辑正在投放的广告位时无内容显示。

这次还发现有一个分页标签,点下方的2可以看下一页,一直没用过这个标签,第一次用。

评分

参与人数 1无忧币 +5 收起 理由
我是来搞事的 + 5 拍马屁

查看全部评分

52#
发表于 2023-6-3 21:20:57 | 只看该作者
直说多少钱能下载附件,能下得起我就给你转钱
回复

使用道具 举报

51#
发表于 2022-11-23 12:49:40 | 只看该作者
下载不了的
回复

使用道具 举报

50#
发表于 2022-11-23 12:49:27 | 只看该作者
辛苦了。。希望论坛越来越好
回复

使用道具 举报

49#
发表于 2021-4-19 21:47:55 | 只看该作者
看看
回复

使用道具 举报

48#
发表于 2020-11-24 03:16:12 | 只看该作者
没有问题
回复

使用道具 举报

47#
发表于 2020-9-29 10:30:48 | 只看该作者
新安装最新版本, 怎么  
回复

使用道具 举报

46#
发表于 2020-9-25 19:59:57 | 只看该作者
辛苦了
回复

使用道具 举报

45#
发表于 2020-8-6 18:34:31 | 只看该作者
进来学习一下
回复

使用道具 举报

44#
发表于 2020-8-4 16:12:30 | 只看该作者
怎么下载???????????????????????????????????????????????????????????
回复

使用道具 举报

43#
发表于 2020-7-17 12:55:44 来自手机 | 只看该作者
感谢分享
回复

使用道具 举报

42#
发表于 2020-7-16 16:12:20 | 只看该作者
大佬,全新安装的patch文件现在有版本更新吗,因为我看到你后面的帖子说转换过程有问题的说
回复

使用道具 举报

41#
发表于 2020-6-30 18:33:44 | 只看该作者
版主辛苦了。。希望论坛越来越好。。
回复

使用道具 举报

40#
发表于 2020-2-20 00:46:58 | 只看该作者
无忧启动
回复

使用道具 举报

39#
发表于 2020-1-7 19:17:07 | 只看该作者
我也去试试
回复

使用道具 举报

38#
发表于 2019-12-16 22:46:03 | 只看该作者
VIP会员 大元帅
回复

使用道具 举报

37#
发表于 2019-12-2 11:10:28 | 只看该作者
感谢楼主,已经完美支持emoji表情符
回复

使用道具 举报

36#
发表于 2019-10-15 21:20:16 | 只看该作者
钉钉
回复

使用道具 举报

35#
发表于 2019-8-10 11:49:35 | 只看该作者
听说修改完可以完美支持偏僻汉字,特来测试:𣹳  𡖊  
回复

使用道具 举报

34#
发表于 2018-12-2 22:39:36 来自手机 | 只看该作者
我的VBB也改了这个的。。
回复

使用道具 举报

33#
发表于 2018-10-30 17:48:07 | 只看该作者
版主辛苦了。
回复

使用道具 举报

32#
发表于 2018-10-30 17:29:07 | 只看该作者
大佬牛逼,我们也为改utf8mb4这个事伤透脑筋。
回复

使用道具 举报

31#
发表于 2018-10-30 17:11:58 | 只看该作者
ding@################
回复

使用道具 举报

30#
发表于 2018-10-30 17:11:50 | 只看该作者
zhichi@@@@@@@@@@@
回复

使用道具 举报

29#
 楼主| 发表于 2018-8-16 10:53:51 | 只看该作者
liaofabiao 发表于 2018-7-1 22:47
测试转换utf8mb4数据库会出错吗?我上面人很多 !哪种方法比较完美呢 各给建议  现数据库UTF8 停机时间长就 ...

最好先在本地虚拟机环境(一般人比较难做到这一点)下先进行数据转换,没有问题以后,再导数据到实机上。
回复

使用道具 举报

28#
发表于 2018-7-1 22:47:22 | 只看该作者
测试转换utf8mb4数据库会出错吗?我上面人很多 !哪种方法比较完美呢 各给建议  现数据库UTF8 停机时间长就麻烦!

点评

最好先在本地虚拟机环境(一般人比较难做到这一点)下先进行数据转换,没有问题以后,再导数据到实机上。  详情 回复 发表于 2018-8-16 10:53
回复

使用道具 举报

27#
 楼主| 发表于 2018-6-1 15:44:37 | 只看该作者
对现有的库或表转换字符集
如库名bbs,表名 table1

  1. ALTER DATABASE bbs CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; 
  2. ALTER TABLE table1 CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_bin; 
复制代码
回复

使用道具 举报

26#
 楼主| 发表于 2018-6-1 10:55:36 | 只看该作者
这几天一直没转顺利,很大原因在于不知道mysql 校对集对大小写敏感差异。

以下是转载网上的

utf8_bin跟utf8_general_ci的区别

ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的;

bin 是二进制, a 和 A 会区别对待.

例如你运行:

SELECT * FROM table WHERE txt = 'a'

那么在utf8_bin中你就找不到 txt = 'A' 的那一行, 而 utf8_general_ci 则可以.
回复

使用道具 举报

25#
 楼主| 发表于 2018-6-1 00:37:55 | 只看该作者
发现 InnoDB 导入数据的速度好慢好慢,可能只有 MyISAM 的十分之一。
回复

使用道具 举报

24#
 楼主| 发表于 2018-5-31 07:05:38 | 只看该作者
转载:Discuz X前台删除了DIY模块,后台“模块管理”中却删不掉怎么办?解决

今天重做首页,先统一在前台将所有“原来的DIY模块"删除,然后新建,但是做完后去后台一看,靠,很多删掉了的“原来的DIY模块"在“后台-门户-模块管理”中还存在着,只是“所在页面”一栏被标示为“未填写”了,而且还没有可以删除的按钮。这个怎么回事以及怎么办啊。



哈,今天官方刚好有张帖子说这事,原文如下:

今天看见很多人说自己明明已在前台删除了某个DIY模块,它在后台“门户-模块管理”中却仍然存在,被标示为“未填写”,且无法被删除,无聊就去试了一下,用多种顺序试过。
结果发现原因简单得要死。。。。。。
这个仅仅是因为删除模块的时候,不是“先删模块再删嵌套该模块的框架”,而是“直接删除嵌套该模块的框架”。直接删除嵌套该模块的框架,模块在前台是没有了,但后台并没有接到删除该模块的指令。
“模块”的菜单是蓝色,“框架”的菜单是红色的,先删蓝色再删红色,保证没有任何问题。
想偷懒将“模块”与“框架”同时删除,那是要付出代价的。
任何时候偷懒都要付出更大的代价。

如果已经出现问题了,那么......
1、去数据库的pre_common_block表里删除“门户-模块管理”中多余的模块。
2、去数据库的pre_common_diy_data表里删除“门户-页面管理”中多余的页面。
  1. truncate table pre_common_diy_data;
复制代码
回复

使用道具 举报

23#
 楼主| 发表于 2018-5-29 19:14:30 | 只看该作者
目前还是存在数据导入不完整,有显示重复,解决中。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2025-12-12 03:39

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表