意外的乱码

在尝试用go操作pg数据库时,由于连接参数的笔误,意外得到了一条包含乱码的错误消息,很显然是字符编码的问题:win系统默认是gbk编码,debian一般都默认utf8编码,做一下编码转换就可以了。

虽然很容易得到期望的结果,但还是引出了我很深的疑惑,因为这表现出了跨平台的不一致性,而这正是我一直都在设法避免的。

环境说明

排查

统一服务端编码

\l命令查看,win上的pgEncodingutf8CollateCtypecp932,即gbkdebian上的pg全部是utf8

win上使用bin\initdb -D data -U postgres -A password --locale=zh_CN.UTF-8 -E utf8 -W重新安装,全部变为utf8

此时进行测试,发现数据库连接成功之后的错误消息都是utf8的,但连接过程中的错误消息还是gbk

修改系统默认编码

修改windows区域设置,勾选Beta版:使用 Unicode UTF-8 提供全球语言支持(U),重启系统。

此时进行测试,无论哪个环节,错误消息都是utf8。但这很可能会影响到其它程序,尤其是比较旧的程序或为了兼容旧系统的程序,因此,虽然可行,但还是不能采用。

其它对比

使用Lazarus自带组件,配合libpq.dll,进行测试,在不修改系统默认编码的情况下,与go的程序表现一样。

结论

目前,暂时无法通过修改配置使pg达到在windowsdebian上的表现完全一致,但通过配置可以达到除连接成功前的错误消息编码外的一致性(至少暂未发现其它不一致处)。