Redmine 設定資料庫編碼為 UTF8MB4 以支援表情符號


各位在使用Redmine時,如果資料庫編碼正確的話,相信中文字是可以正常顯示的,不過會遇到另一個問題是一些特殊符號或表情符號無法支援,只要一輸入就可能會造成破圖或者出現Internal Error (如下圖),錯誤的原因很簡單,十之八九是資料庫的編碼不對而已,原本的編碼有可能是utf8、latin1,但這些編碼無法滿足某些特別的字符,因此,想要支援表情符號的話只要把編碼改成更強大的 utf8mb4 字符編碼就行囉,簡單的來說,utf8mb4是utf8的Superset,能支持更多的字符。
註:如果有遇到中文亂碼的問題,以下的教學也可以適用。

Redmine輸入表情符號錯誤

如何查詢資料庫編碼

各位可以先查看一下自己的資料庫編碼是否符合預期,指令如下(登入MySQL/MariaDB後執行),如果要進一步討論中文亂碼相關的問題,也可以參考這篇文章

show variables like "%character_set%";

查看Redmine資料庫的編碼

變更資料庫編碼至UTF8MB4

需要把資料庫編碼變成「utf8mb4」,才能解決一些特殊文字、表情符號的呈現問題,而這部分可能還牽扯到一些資料庫、表格、欄位的轉換,所以這邊直接提供了二個方法給大家參考,請選擇自己適合的方式進行

方法一:利用MySQL/MariaDB的指令進行轉換

在網路上有高手把要轉換的地方寫成了自動偵測的腳本,原文在此,其步驟簡述如下:

Step 1、變更之前建議先備份資料庫,可參考之前教大家的「MySQL/MariaDB資料庫備份」文章

Step 2、把下面語法中的YOUR_DATABASE_NAME修改成你的資料庫名稱(有4個),然後存成一個gen_queries.sql,檔名可以自訂

USE information_schema;
SELECT CONCAT("ALTER DATABASE `",table_schema,"` CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;") AS _sql
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema UNION
SELECT CONCAT("ALTER TABLE `",table_schema,"`.`",table_name,"` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;") AS _sql  
FROM `TABLES` WHERE table_schema LIKE "YOUR_DATABASE_NAME" AND TABLE_TYPE='BASE TABLE' GROUP BY table_schema, table_name UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type,"(",character_maximum_length,") CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql 
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('varchar','char') AND TABLE_TYPE='BASE TABLE' UNION
SELECT CONCAT("ALTER TABLE `",`COLUMNS`.table_schema,"`.`",`COLUMNS`.table_name, "` CHANGE `",column_name,"` `",column_name,"` ",data_type," CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci",IF(is_nullable="YES"," NULL"," NOT NULL"),";") AS _sql 
FROM `COLUMNS` INNER JOIN `TABLES` ON `TABLES`.table_name = `COLUMNS`.table_name WHERE `COLUMNS`.table_schema like "YOUR_DATABASE_NAME" and data_type in ('text','tinytext','mediumtext','longtext') AND TABLE_TYPE='BASE TABLE';

Step 3、執行以下指令來產生queries.sql

mysql -u root -p -s < gen_queries.sql > queries.sql

Step 4、執行以下指令進行資料庫轉檔

mysql -u root -p < queries.sql

這方法雖然比較麻煩一點,但適合一些沒有使用資料庫輔助工具的用戶,親試過是可行的

方法二:使用phpMyAdmin完成轉換

如果你本身有用「phpMyAdmin」來操作資料庫的話那就更方便啦,請於登入phpMyAdmin之後,在左邊選擇Redmine使用的資料庫,要注意的是下圖只是示意,你需要選擇你的資料庫名稱 (如果你是按本網站的教學系列一路做下來,那麼資料庫名稱為 redmine_default ),選擇好之後再點擊右邊的「操作」頁籤

進入phpMyAdmin的操作頁籤

在「操作」頁面中請將網頁拉到下方,並在「編碼與排序」的分項中,完成以下動作:

  1. 將編碼設成utf8mb4_unicode_ci或者utf8mb4_general_ci,建議前者
  2. 勾選「更改所有資料表的編碼與排序」及「更改所有資料表欄位的編碼與排序」(註:前者勾選之後,後者才會出現),並按「執行」進行資料庫的編碼轉換

使用phpMyAdmin變更資料庫編碼

不管你使用上述哪個方法都可以達到UTF8MB4編碼的轉換效果,而最後一步就是到Redmine試試看是否可以正常輸入表情符號囉

Redmine支援表情符號的顯示

延伸閱讀:
Redmine 專案管理工具教學系列
[Mac] 快速啟動表情符號表,很多人不知道的熱鍵密技
[教學] MariaDB/MySQL備份 – 如何匯出、匯入資料庫或表格
[Mariadb] 如何解決資料庫中文亂碼(問號)的編碼問題
Set value of character_set_client to utf8mb4