[分享] 讓 Discuz! 支持 Emoji 表情符號,以 utf8mb4 取代 UTF-8 版本
現在 Emoji 已逐漸普及,尤其手機用戶使用 Emoji 的頻率也越來越高
不過傳統的 UTF 8 編碼資料庫無法儲存 Emoji 符號,所以常常造成內容輸入後表情變空白的問題,
Discuz 本身是討論區,又只有 UTF 8 編碼能使用,實在是不完美,所以就只好自己手動修改了~
Discuz 身為華語地區最大的論壇提供商,又是騰訊旗下的公司管理開發的,卻一直保持擺爛狀態,
雖然 X3.3 已經開源了,不過 Issue 沒在處理,PR 除非是比較大的漏洞也很少在合併,
新功能不太想加,https 不想支援,編輯器的坑太深所以 Bug 也索性不管了,通通只能自己來,嘆氣~
以上抱怨完畢,接著開始進入正題 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
:
$_config['db'][1]['dbcharset'] = 'utf8mb4';
開啟 config_ucenter.php
修改第 17 行的 UC_DBCHARSET
:
define('UC_DBCHARSET', 'utf8mb4');
開啟 uc_server/data/config.inc.php
,修改第 6 行的 UC_DBCHARSET
:
define('UC_DBCHARSET', 'utf8mb4');
3. 修改資料庫編碼
如果是全新安裝的,修改 install/index.php
,找到第 375 行:
runquery($sql);
上方加上:
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 後按 [儲存]
將總共 14+1 個地方全部修改完畢即可。
修改資料庫編碼
接著回到資料庫,點擊 [操作],找到編碼與排序後選擇 utf8mb4_general_ci
,點擊 [執行]
如此一來資料庫編碼就修改完成。
修改資料表編碼
這部分比較麻煩一點,不過有個偷懶的方式可以批次修改(來源),首先到資料庫中切換到 [SQL],輸入指令 SHOW TABLES;
並執行:
執行後就會看到所有的資料表名稱,把頁面拉到最下方去,點擊 [複製到剪貼簿]
開啟 NimbleText,把東西直接貼到 For each row in this list 下方的框框內,不過上面的說明和空白部分都不要,所以把它刪除
接著在下方的 Substitute using this pattern 框框內貼上:
ALTER TABLE `$0` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
恭喜!你成功的執行了懶人步驟,趕快把下方 Results 裡的內容全部複製起來
再次進入資料庫的 SQL 指令頁面,把複製的東西全部貼進去,按下 [執行]
大功告成~
以上方法可能不是最完美的方法,不過至少是可行的方法,如果有任何疑問或建議歡迎提出討論~
壯陽藥品
感謝分享
123
計劃按照此文修改,請問博主修改后至今有無遇到Bug,有無副作用?
Lay
暫時沒有。
JoyLemon
赞喔!希望升x3.5能自动转换,要是不行的话就要来走一遍流程了,谢谢分享 :wink:
Lay
3.5 看來是遙遙無期...