開啟輔助瀏覽

Besv免費服務

 找回密碼
 立即註冊
搜尋
熱搜: Besv 免費 代架
查看: 182|回覆: 1

discuzX3.4數據庫改用utf8mb4字符集,實現的表情符號表情符

[複製連結]
發表於 2018-7-23 19:16:23 | 顯示全部樓層 |閱讀模式
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官方原版文件中,即可完成安裝。
(此檔為簡體中文版這裡不提供附件上傳只好放到自己的雲端也不保證哪一天我會不會突然想刪掉此檔所以不提供補檔)
https://drive.google.com/open?id ... ujypTJ_YikQEjcOQWcM

二、換服務器升級安裝(內容更新中)

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

编辑器设置 > Discuz!代码,删除那些不可用的标签,可解决因使用Discuz标签而导致帖子内容无法正常显示的问题。">6.界面 > 編輯器設置 > Discuz!代碼,刪除那些不可用的標籤,可解決因使用Discuz標籤而導致帖子內容無法正常顯示的問題。
 樓主| 發表於 2018-7-23 19:17:05 | 顯示全部樓層
本帖最後由 52313 於 2018-7-23 19:35 編輯

因為BESV這裡有內文的字數限制 只好以回覆的方式補充

7.升級安裝成功

目前仍存在問題:編輯正在投放的廣告位時無內容顯示。


如果ENGINE使用InnoDB,則修改
ENGINE=MyISAM 全部替換為 ENGINE=InnoDB

並將所有有auto_increment 屬性的,加為KEY。
如 id 有auto_increment屬性,則在相應段加上一行 KEY `id` (`id`), (如果已有完全相同這一行就不要加)

以下是這次解決問題過程,沒興趣的可不看:

1.常規安裝,然後導出數據庫,修改默認字符集

sed -i '/DEFAULT CHARSET=utf8[^m]/s/DEFAULT CHARSET=utf8/&mb4/' bbs.sql

2.使用ENGINE=MyISAM ,如果直接導入bbs.sql,會出錯,提示如下:


ERROR 1071 (42000) at line 104: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 115: Table 'bbs.pre_common_admincp_perm' doesn't exist
ERROR 1146 (42S02) at line 116: Table 'bbs.pre_common_admincp_perm' doesn't exist
ERROR 1146 (42S02) at line 117: Table 'bbs.pre_common_admincp_perm' doesn't exist
ERROR 1146 (42S02) at line 118: Table 'bbs.pre_common_admincp_perm' doesn't exist
ERROR 1071 (42000) at line 631: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 643: Table 'bbs.pre_common_cache' doesn't exist
ERROR 1146 (42S02) at line 644: Table 'bbs.pre_common_cache' doesn't exist
ERROR 1146 (42S02) at line 645: Table 'bbs.pre_common_cache' doesn't exist
ERROR 1071 (42000) at line 655: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 677: Table 'bbs.pre_common_card' doesn't exist
ERROR 1146 (42S02) at line 678: Table 'bbs.pre_common_card' doesn't exist
ERROR 1146 (42S02) at line 679: Table 'bbs.pre_common_card' doesn't exist
ERROR 1071 (42000) at line 1831: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 1857: Table 'bbs.pre_common_member_profile_setting' doesn't exist
ERROR 1146 (42S02) at line 1858: Table 'bbs.pre_common_member_profile_setting' doesn't exist
ERROR 1146 (42S02) at line 1859: Table 'bbs.pre_common_member_profile_setting' doesn't exist
ERROR 1146 (42S02) at line 1860: Table 'bbs.pre_common_member_profile_setting' doesn't exist
ERROR 1071 (42000) at line 1870: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 1888: Table 'bbs.pre_common_member_security' doesn't exist
ERROR 1146 (42S02) at line 1889: Table 'bbs.pre_common_member_security' doesn't exist
ERROR 1146 (42S02) at line 1890: Table 'bbs.pre_common_member_security' doesn't exist
ERROR 1071 (42000) at line 2673: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 2684: Table 'bbs.pre_common_setting' doesn't exist
ERROR 1146 (42S02) at line 2685: Table 'bbs.pre_common_setting' doesn't exist
ERROR 1146 (42S02) at line 2686: Table 'bbs.pre_common_setting' doesn't exist
ERROR 1146 (42S02) at line 2687: Table 'bbs.pre_common_setting' doesn't exist
ERROR 1071 (42000) at line 4800: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 4816: Table 'bbs.pre_forum_groupfield' doesn't exist
ERROR 1146 (42S02) at line 4817: Table 'bbs.pre_forum_groupfield' doesn't exist
ERROR 1146 (42S02) at line 4818: Table 'bbs.pre_forum_groupfield' doesn't exist
ERROR 1071 (42000) at line 7101: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 7120: Table 'bbs.pre_home_favorite' doesn't exist
ERROR 1146 (42S02) at line 7121: Table 'bbs.pre_home_favorite' doesn't exist
ERROR 1146 (42S02) at line 7122: Table 'bbs.pre_home_favorite' doesn't exist
ERROR 1071 (42000) at line 7797: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 7808: Table 'bbs.pre_mobile_setting' doesn't exist
ERROR 1146 (42S02) at line 7809: Table 'bbs.pre_mobile_setting' doesn't exist
ERROR 1146 (42S02) at line 7810: Table 'bbs.pre_mobile_setting' doesn't exist
ERROR 1146 (42S02) at line 7811: Table 'bbs.pre_mobile_setting' doesn't exist
ERROR 1071 (42000) at line 8567: Specified key was too long; max key length is 1000 bytes
ERROR 1146 (42S02) at line 8582: Table 'bbs.pre_ucenter_badwords' doesn't exist
ERROR 1146 (42S02) at line 8583: Table 'bbs.pre_ucenter_badwords' doesn't exist
ERROR 1146 (42S02) at line 8584: Table 'bbs.pre_ucenter_badwords' doesn't exist

處理方法1:
-----------------
根據 ERROR 1071 (42000) at line 104: Specified key was too long; max key length is 1000 bytes 提示,查找 bbs.sql 文件相應行104行及後續10行:

sed -n '104,114p' bbs.sql


CREATE TABLE `pre_common_admincp_perm` (
  `cpgroupid` smallint(6) unsigned NOT NULL,
  `perm` varchar(255) NOT NULL,
  UNIQUE KEY `cpgroupperm` (`cpgroupid`,`perm`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `pre_common_admincp_perm`
--

1000 , 只要把`perm` varchar 值改小,使其总和不要超过1000即可。">可以看出 UNIQUE KEY `cpgroupperm` (`cpgroupid`,`perm`) 定義的長度 是 (6+255) * 4 > 1000 , 只要把`perm` varchar 值改小,使其總和不要超過1000即可。
現在改為 230.

sed -i '106s/255/230/' bbs.sql


其他類似提示的行做同樣的修改,成功導入數據庫。

處理方法2:
-----------------
根據上面提示中出現的所有表,對安裝文件先做處理

pre_ucenter_badwords 表:對應查 uc_badwords ,從 uc_server/install/uc.sql 修改
其他表在 install/data/install.sql 修改

官方原始文件 config 下的所有.php文件中的 utf8 都改為 utf8mb4
注意 utf-8 不要改動。

改好以下文件
install/data/install.sql
uc_server/install/uc.sql

修改 install/include/install_var.php

define('DBCHARSET', 'utf8'); 改為 define('DBCHARSET', 'utf8mb4');

再進行安裝。


現在發帖,就可以正常使用表情符了,用戶名都可以用表情符註冊!




您需要登入後才可以回文 登入 | 立即註冊

本版積分規則

黑名單|客戶連結|客服系統

Copyright © 2013 - 2017 Besv Service Team

Powered by Discuz!

Wildcard SSL Certificates

快速回覆 返回頂部 返回列表