Loading... ![Discuz UTF8MB4+Innodb.png](/usr/uploads/2018/10/3793361238.png) <div class="tip inlineBlock success"> Discuz!X3算是个老程序了,使用的数据库编码是UTF8的,而不是正真的UTF8,这样会使用户在发帖什么的使用了一些特殊的汉字(非常不常见的)或者使用了Emoji表情,会导致在提交的时候如果使用了这些字符,那么这些字符之后以及包括字符本身都会无法储存进数据库中,某些情况下还会导致没有内容,所致在某个周末对Discuz的数据库进行了研究。 </div> <div class="tip inlineBlock warning"> 本教程仅适用于Discuz!X3 UTF8版,GBK版需要先看另一篇文章操作,需要有一定的Discuz操作经验,以及**转换之后可能会有某些不可预知的问题**,目前本人还没发现什么问题,已知某些插件安装的时候会BOOM!需要手动安装插件的数据库。由于本人懒教程图片晚点加 </div> ### 1、数据库操作 去phpmyadmin进入discuz的数据库执行这些命令 ```sql ALTER TABLE pre_common_admincp_perm DROP KEY `cpgroupperm`, ADD KEY `cpgroupperm` (`cpgroupid`, `perm`(40)); ALTER TABLE pre_common_advertisement_custom DROP KEY `name`, ADD KEY `name` (`name`(100)); ALTER TABLE pre_common_block_style DROP KEY `hash`, ADD KEY `hash` (`hash`(10)), DROP KEY `blockclass`, ADD KEY `blockclass` (`blockclass`(50)); ALTER TABLE pre_common_cache DROP PRIMARY KEY, ADD PRIMARY KEY (`cachekey`(50)); ALTER TABLE pre_common_card DROP PRIMARY KEY, ADD PRIMARY KEY (`id`(50)); ALTER TABLE pre_common_member_profile_setting DROP PRIMARY KEY, ADD PRIMARY KEY (`fieldid`(30)); ALTER TABLE pre_common_member_security DROP KEY `uid`, ADD KEY `uid` (`uid`, `fieldid`(40)); ALTER TABLE pre_common_member_stat_field DROP KEY `fieldid`, ADD KEY `fieldid` (`fieldid`(40)); ALTER TABLE pre_common_setting DROP PRIMARY KEY, ADD PRIMARY KEY (`skey`(40)); ALTER TABLE pre_forum_groupfield DROP KEY `types`, ADD KEY `types` (`fid`, `type`(40)); ALTER TABLE pre_forum_groupfield DROP KEY `type`, ADD KEY `type` (`type`(40)); ALTER TABLE pre_home_favorite DROP KEY `idtype`, ADD KEY `idtype` (`id`, `idtype`(40)); ALTER TABLE pre_home_favorite DROP KEY `uid`, ADD KEY `uid` (`uid`, `idtype`(40), `dateline`); ALTER TABLE pre_mobile_setting DROP PRIMARY KEY, ADD PRIMARY KEY (`skey`(40)); ALTER TABLE pre_portal_topic DROP KEY `name`, ADD KEY `name` (`name`(40)); ALTER TABLE pre_ucenter_badwords DROP KEY `find`, ADD KEY `find` (`find`(100)); ``` 需要同时支持UTF8MB4+Innodb的还需进行以下操作 备份pre_common_member_grouppm表中的数据然后执行 ```sql ALTER TABLE pre_forum_post CHANGE position position int(8) unsigned NOT NULL; ALTER TABLE pre_common_member_grouppm ADD INDEX gpmid(gpmid); ``` 这里主要是MySQL的InnoDB规则为每个表只能有个一个自增列并且这个列必须是一个key,所以把gpmid和position这两个列新增为一个键让它自增。 接下来执行命令 ```sql SHOW TABLES; ``` 复制结果 ### 2、接下来打开软件**NimbleText** 将结果张贴到**For each row in this list**那里 在**Substitute using this pattern**那里张贴一下内容 ```sql ALTER TABLE `$0` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; ``` 按下**Results**下的**Calumniate** ![Discuz to UTF8MB4](/usr/uploads/2018/10/3248348263.png) 复制结果,然后去phpmyadmin那执行SQL命令就可以了 如果需要Innodb,之后按照这个教程去操作即可 [http://www.discuz.net/thread-3330856-1-1.html](http://www.discuz.net/thread-3330856-1-1.html) 之后按照这个教程去操作即可 ### 3、修改文件 修改config/config_global.php中的 ```php $_config['db']['1']['dbcharset'] = 'utf8'; ``` 为 ```php $_config['db']['1']['dbcharset'] = 'utf8mb4'; ``` 修改config_ucenter.php ```php define('UC_DBCHARSET', 'utf8'); ``` ```php define('UC_DBCHARSET', 'utf8mb4'); ``` uc_server/data/config.inc.php ```php define('UC_DBCHARSET', 'utf8'); ``` ```php define('UC_DBCHARSET', 'utf8mb4'); ``` ### 4、操作完成后去后台更新下缓存即可 Last modification:November 6, 2024 © Reprint prohibited Support Appreciate the author AliPayWeChat Like 1 If you think my article is useful to you, please feel free to appreciate