悬而未决 – perl 程序读取数据库乱码

某系统,正常运行在服务器A,现想搬到服务器B。所有已知的环境至少大版本号都一致,大部分环境版本完全一致。

问题出现:在B上查询本地数据库一个内容是中文的varchar字段,dbi报错,如下:

随后就围绕着这个报错开始尝试。

首先是看数据库的各种字符集的配置,如下:

系统、程序文件、数据库的相关参数、数据表、字段都是gbk,问题依旧。

但是注意到报错中,应该是“=”右侧是“latin1_swedish_ci,COERCIBLE”,所以开始考虑问题不在mysql上。

随后继续测试,在程序里直接查询问题出现的那个字段,得到的结果依旧乱码。但各种操作、直接在数据库里进行,都是正常的,如下:

但是在程序里增加了set names gbk,查询结果就正常,如下:

但是现有系统古老且平稳,上述的数据库连接到处存在,每处都增加set names gbk并不现实,故继续排查。

此时注意到mysql的配置文件中已有的一句话:init_connect

顺手查了一下init_connect的作用,疑惑为什么不起作用。随后在这篇文章中,看到了一些其他的配置,添加到配置文件中测试:

至此,问题解决。

另外,“skip-character-set-client-handshake”,这一句话还没有添加的时候,问题依旧,加上这一句之后,问题解决。于是又顺手查了一下这句话的作用,这里

问题虽然解决,但在B服务器上为何出现这个问题现在并不知道,待查。

另,记录一篇文章

    分享到:

发表评论

电子邮件地址不会被公开。 必填项已用*标注