应开发同事的要求,部署了Gitlab+Gerrit+Jenkins的持续集成环境。
但是我发现了一个问题。 Gerrit登录后出现中文乱码
具体情况如下:
(1)Git代码中中文乱码处理:
为了妥善解决中文编码问题,对所有git仓库做了以下约定:
所有文本文件必须采用utf8编码存储
全局配置如下:
git config --global core.quotepath false
git config --global i18n.logoutputencoding utf8
git config --global i18n.commitencoding utf8
另外:安装gerrit时,将数据库的编码(如果选择myqsl模式)设置为utf8
(2)Gerrit登录后中文用户名乱码
在“全名”栏输入中文姓名后,刷新乱码“???”,如下:
后来我想可能是创建gerrit数据库时编码没有自定义为utf8
登录数据库查看代码:
mysql> 显示类似 '%character%' 的变量;
+----------------------------------------+----- -----------------------------------------+
|变量名 |值 |
+------------------------------------------------+----------------- -----------------+
|字符集客户端 | utf8 |
|字符集连接 | utf8 |
|字符集数据库utf8 |
|字符集文件系统 |二进制 |
|字符集结果 | utf8 |
| character_set_server | latin1 |
|字符集系统utf8 |
|字符集目录 | /usr/local/mysql/share/charsets/ |
+------------------------+-------- ---------------------------+
8 行一组(0.00 秒)
查找直接查询目标表,不支持中文:
mysql> 使用 gerritdb;
数据库已更改
mysql> 从帐户中选择 full_name,account_id;
+------------+--------- ---+
|全名 | account_id |
+-----------+------------+
|戴兹者| 5 |
|格里特 | 1 |
|詹金斯 | 3 |
|王世博 | 2 |
+-----------+------------+
4 行一组(0.00 秒)
mysql> update account set full_name = "王士博" where account_id = 2;
查询正常,1行受影响,1个警告(0.00秒)
匹配行:1更改:1警告:1
mysql> 从帐户中选择 full_name,account_id;
+-----------+------------+
|全名 | account_id |
+-----------+------------+
| ??? | 2 |
|戴智者| 5 |
|格里特 | | 1 |
|詹金斯| | 3 |
+-----------+------------+
4 行一组(0.00 秒)
解决办法:
********************************************************
首先确保服务器的系统编码支持中文
[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]
......
?然后重启mysql服务
[root@115 ~]# /etc/init.d/mysqld restart
关闭MySQL。 [确定]
启动MySQL..[确定]
**************************************************** *
修改了mysql的编码,保证各个编码参数都是utf8,如下:
mysql> 显示类似 '%character%' 的变量;
+----------------------------------------+----- -----------------------------------------+
|变量名 |值 |
+-------- ------------------+----------------- ----------------- ---+
|字符集客户端 | utf8 |
|字符集连接 | utf8 |
|字符集数据库 | utf8 |
|字符集文件系统 |二进制 |
|字符集结果 | utf8 |
|字符集服务器 | utf8 |
|字符集系统 | utf8 |
|字符集目录 | /usr/local/mysql/share/charsets/ |
+----------------- --------+-------- --------------------------+
8 行一组(0.00 秒)
但是我发现Gerrit中的“全名”设置成中文名还是乱码
最后发现这是因为“Full name”字段所在的表结构被硬编码为latin1
第一个 mysqldump 无处不在的 gerritdb 数据库
[root@115 ~]#mysqldump gerritdb -p > gerritdb.sql
然后检查gerritdb.sql备份文件
我发现gerritdb库中所有表的编码都是latin1! ! ! !
[root@115 ~]#vim gerritdb.sql
解决方法:
现在将 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>删除数据库gerritdb;
mysql>创建数据库 gerritdb 字符集 utf8 COLLATE utf8_general_ci;
最后将修改后的gerritdb.sql备份文件(编码已修改为utf8)导入到gerritdb空数据库中
[root@115 ~]#mysql gerritdb -p < gerritdb.sql
查了一下,发现支持中文了
mysql> 使用 gerritdb;
数据库已更改
mysql> 从帐户中选择 full_name,account_id;
+------------+--------- ---+
|全名 | account_id |
+-----------+------------+
|戴兹者| 5 |
|格里特 | 1 |
|詹金斯 | 3 |
|王世博 | 2 |
+-----------+------------+
4 行一组(0.00 秒)
mysql> update account set full_name = "王士博" where account_id = 2;
查询正常,1行受影响(0.00秒)
匹配的行:1更改:1警告:0
mysql> 从帐户中选择 full_name,account_id;
+-----------+------------+
|全名 | account_id |
+-----------+------------+
|戴智者 | | 5 |
|格里特 | | 1 |
|詹金斯 | | 3 |
|王士博 | | 2 |
+-----------+------------+
4 行一组(0.00 秒)
mysql>