当前位置:硬件测评 > 【原创】Gerrit分享中文乱码问题的解决办法

【原创】Gerrit分享中文乱码问题的解决办法

  • 发布:2023-09-29 07:24

应开发同事的要求,部署了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>

相关文章