天天看點

[原創]Gerrit中文亂碼問題解決方案分享

應開發同僚的要求,部署了Gitlab+Gerrit+Jenkins的持續內建環境.

但是發現了一個問題,Gerrit登陸後有中文亂碼出現.

具體情況如下:

(1)Git代碼中的中文亂碼處理:

為妥善解決中文編碼的問題,對所有git repository做如下約定:

所有文本檔案都必須存儲成utf8編碼

全局配置如下:

git config --global core.quotepath false

git config --global i18n.logoutputencoding utf8

git config --global i18n.commitencoding utf8

另外:安裝gerrit的時候對于資料庫(選擇myqsl方式的話)的編碼設定為utf8

(2)Gerrit登陸後,設定中文使用者名出現亂碼

即在“Full name”一欄中輸入中文名後,重新整理一下就會出現“???”的亂碼,如下:

[原創]Gerrit中文亂碼問題解決方案分享

後來想到,可能是在建立gerrit資料庫的時候沒有自定義編碼為utf8

登陸資料庫,檢視編碼:

mysql> show variables like '%character%';

+--------------------------+----------------------------------+

| Variable_name | Value |

| character_set_client        | utf8 |

| character_set_connection | utf8 |

| character_set_database    | utf8 |

| character_set_filesystem  | binary |

| character_set_results       | utf8 |

| character_set_server    | latin1 |

| character_set_system       | utf8 |

| character_sets_dir | /usr/local/mysql/share/charsets/ |

8 rows in set (0.00 sec)

發現直接查詢目标表,不支援中文:

mysql> use gerritdb;

Database changed

mysql> select full_name,account_id from accounts;

+-----------+------------+

| full_name | account_id |

| daizizhe | 5 |

| gerrit | 1 |

| jenkins | 3 |

| wangshibo | 2 |

4 rows in set (0.00 sec)

mysql> update accounts set full_name = "王士博" where account_id = 2;

Query OK, 1 row affected, 1 warning (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 1

| ???           | 2 |

| daizizhe     | 5 |

| gerrit        | 1 |

| jenkins      | 3 |

4 rows in set (0.00 sec) 

解決辦法:

**********************************************

首先保證伺服器的系統編碼是支援中文的

[root@115 ~]# cat /etc/sysconfig/i18n

LANG="zh_CN.UTF-8"

修改mysql資料庫編碼為utf8,支援中文

1)臨時修改character_set_server的編碼

mysql> character_set_server='utf8'; 

2)永久性生效

修改mysql服務的配置檔案/etc/my.cnf

[root@115 ~]# vim /etc/my.cnf

.......

[mysqld]

......

character_set_server = utf8            【添加這一行内容】

然後重新開機mysql服務

[root@115 ~]# /etc/init.d/mysqld restart

Shutting down MySQL. [确定]

Starting MySQL.. [确定]

已經修改了mysql的編碼,保證各個編碼參數均為utf8了,如下:

| Variable_name | Value |

| character_set_client | utf8 |

| character_set_connection | utf8 |

| character_set_database | utf8 |

| character_set_filesystem | binary |

| character_set_results | utf8 |

| character_set_server | utf8 |

| character_set_system | utf8 |

| character_sets_dir | /usr/local/mysql/share/charsets/ |

但是發現Gerrit裡面的“Full name”設定成中文名還是亂碼

最後發現這是因為“Full name”字段所在的表結構了就已經寫死了編碼為latin1 

先mysqldump到處gerritdb資料庫

[root@115 ~]#mysqldump gerritdb -p > gerritdb.sql

然後檢視gerritdb.sql備份檔案

發現gerritdb庫裡所有表的編碼都是latin1啊!!!!

[root@115 ~]#vim gerritdb.sql

[原創]Gerrit中文亂碼問題解決方案分享

補救措施:

現将gerritdb.sql備份檔案裡的latin1_bin替換成utf8_general_ci

再将gerritdb.sql備份檔案裡的latin1替換成utf8

vim替換如下:

:%s/latin1_bin/utf8_general_ci/g

:%s/latin1/utf8/g

接着删除gerritdb資料庫

再建立空的gerritdb庫,建立的時候指定編碼為utf8

mysql>drop database gerritdb;

mysql>create database gerritdb CHARACTER SET utf8 COLLATE utf8_general_ci;

最後再将修改好的gerritdb.sql備份檔案(已經修改編碼為utf8了)導入到gerritdb空庫呢

[root@115 ~]#mysql  gerritdb -p < gerritdb.sql

檢查下,發現可以支援中文了

Query OK, 1 row affected (0.00 sec)

Rows matched: 1 Changed: 1 Warnings: 0

| daizizhe       | 5 |

| gerrit          | 1 |

| jenkins        | 3 |

| 王士博          | 2 |

mysql>

[原創]Gerrit中文亂碼問題解決方案分享

*************** 當你發現自己的才華撐不起野心時,就請安靜下來學習吧!***************