首先明确一个东西,如果confluence写得文章保存以后出现乱码,那么只有三种可能:
- 文件系统编码不正确。不支持中文(上传的附件中有中文,预览出现乱码,大部分是这个原因)
- 数据库编码不正确(大部分是这个原因)
- 数据连接串没显示指定编码(这个最容易忽略,这次问题也是因为这个)
文件系统编码不正确
confluence官网提供了专门校验文件系统编码的方法。 官网推荐检测文件系统编码具体方法其实很简单,就是用访问下面的URL,confluence会自动检测编码的支持程度。
#如果有域名的话可以用这个URL:
http://confluence.atlassian.com/admin/encodingtest.action
#或者简单粗暴直接用ip访问也行
http://<host address>:<port>/admin/encodingtest.action
如果文件系统编码支持中文,那么继续下一步检验 数据库的编码支持。
数据库编码中文支持
调整数据库乱码分为三步
- 数据库层面上的字符检查
- collation层面的编码检查
- 表结构层次的编码检查数据库层面上的字符检查
#运行下面的sql语句,查看结果,结果应该如下图所示
show variables like 'char%';
sql执行结果应该如下所示:
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 /rdsdbbin/mysql-5.6.27.R1/share/charsets/
如果不是那么分别执行对应的sql语句,然后看下是不是修改成了utf8
set character_set_client=utf8;
set character_set_connection=utf8;
set character_set_database=utf8;
set character_set_results=utf8;
set character_set_server=utf8;
set character_set_system=utf8;
collation层面的编码检查
运行如下的sql语句
show variables like 'collation%';
上面sql运行结果应该如下图所示:
#结果应该如下
collation_connection utf8_general_ci
collation_database utf8_bin
collation_server utf8_general_ci
如果不是上面所示的结果,那么执行对应的sql语句调整过来
ALTER DATABASE <Confluence database name> CHARACTER SET utf8 COLLATE utf8_bin;
set collation_connection=utf8;
set collation_database=utf8 ;
set collation_server=utf8;
表结构f层次的编码检查
#执行如下两个sql,会自动生成修改语句, 然后你只用复制结果sql,执行就可以修复table层级的编码
SELECT CONCAT('ALTER TABLE ', table_name, ' CHARACTER SET utf8 COLLATE utf8_bin;') FROM information_schema.TABLES AS T, information_schema.`COLLATION_CHARACTER_SET_APPLICABILITY` AS C
WHERE C.collation_name = T.table_collation
AND T.table_schema = 'confluence 数据库名字'
AND
(
C.CHARACTER_SET_NAME != 'utf8'
OR
C.COLLATION_NAME != 'utf8_bin'
);
SELECT CONCAT('ALTER TABLE `', table_name, '` MODIFY `', column_name, '` ', DATA_TYPE, ' CHARACTER SET UTF8 COLLATE utf8_bin', (CASE WHEN IS_NULLABLE = 'NO' THEN ' NOT NULL' ELSE '' END), ';')
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'confluence 数据库名字'
AND DATA_TYPE != 'varchar'
AND
(
CHARACTER_SET_NAME != 'utf8'
OR
COLLATION_NAME != 'utf8_bin'
);
经过上面步骤,数据库层面的编码格式已经修复了。
修复数据库连接串的编码
vim /var/atlassian/application-data/confluence/confluence.cfg.xml
#找到如下行
<property name="hibernate.connection.url">jdbc:mysql://jira.csphgnawyi6m.us-west-1.rds.amazonaws.com/confluencedb</property>
#修改为
<property name="hibernate.connection.url">jdbc:mysql://jira.csphgnawyi6m.us-west-1.rds.amazonaws.com/confluencedb?useUnicode=true&characterEncoding=UTF-8</property>