结论
json中文乱码原因
pt-query-digest是perl写的,perl的JSON中文类型与perl不能直接适配,pt-query-digest工具代码中直接返回JSON中文类型变量会导致乱码
my $json = $self->encode_json($data);
$json .= "\n" unless $json =~ /\n\Z/;
return $json;
写库表中文乱码原因
即使mysql 5.7 character_set_server设置为utf8,pt工具无法获取
pt-query-digest逻辑
if (命令行输入了字符集){
if (检查字符集是否为uft8 && 检查mysql_version是否>=8.0){
获取mysql字符集 $charset = $character_set_server;
}
}
if (获取到的$charset包括utf8) {
设置pt工具标准输出为utf8
}
else {
标准输出设置为系统的默认编码(而不是 UTF-8)
}
mysql5.7默认字符集为latin
解决方案
json乱码解决方案
使用 Perl 解码 JSON(decode_json)
Perl 的 decode_json() 函数用于在 Perl 中解码 JSON。这个函数返回从 JSON 解码到适当 Perl 类型的值。
直接修改原文件
vim /usr/bin/pt-query-digest +9
第9行新增use Encode;
第8188行注释return $json;
第8189行新增return Encode::decode_utf8($json);
如果不想打开编辑,可以直接采用sed更改
sed '9c use Encode;' -i /usr/bin/pt-query-digest
sed '8188c\ #return $json;' -i /usr/bin/pt-query-digest
sed '8188a\ return Encode::decode_utf8($json);' -i /usr/bin/pt-query-digest
GitHub - wangtuo1224/mysql_slowlog_report: MySQL慢查询邮件报表
写库表乱码解决方案
mysql5.7配置文件中加入character_set_server = utf8mb4, (已有),pt-query-digest工具命令行后面加上--charset=utf8mb4