[分享] 讓 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.phpconfig/config_ucenter_default.php 兩個檔案,

如果是已安裝(論壇已運作中)的則是修改 config/config_global.phpconfig/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.sqluc_server/install/uc.sql

修改過程有點麻煩,我自己使用的方式如下:

  1. 搜尋關鍵字 255
  2. 查看定義 255 長度的欄位有沒有被定義成主鍵
  3. 有的話就把該欄位長度修改成 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 指令頁面,把複製的東西全部貼進去,按下 [執行]

 

大功告成~

 

以上方法可能不是最完美的方法,不過至少是可行的方法,如果有任何疑問或建議歡迎提出討論~

想隨時追蹤最新資訊?歡迎使用 RSS 訂閱最新文章 »

您或許會感興趣的文章

隨機推薦

共有 5 則迴響

  1. 壯陽藥品

    #1 @

    感謝分享

  2. 123

    #2 @

    計劃按照此文修改,請問博主修改后至今有無遇到Bug,有無副作用?

  3. JoyLemon

    #3 @

    赞喔!希望升x3.5能自动转换,要是不行的话就要来走一遍流程了,谢谢分享 :wink:

    • Lay

      # @

      3.5 看來是遙遙無期...

發表迴響

*