意外的乱码
在尝试用go操作pg数据库时,由于连接参数的笔误,意外得到了一条包含乱码的错误消息,很显然是字符编码的问题:win系统默认是gbk编码,debian一般都默认utf8编码,做一下编码转换就可以了。
虽然很容易得到期望的结果,但还是引出了我很深的疑惑,因为这表现出了跨平台的不一致性,而这正是我一直都在设法避免的。
环境说明
-
pg是在win10上的服务,安装方法见PostgreSQL zip 安装 -
go开发是在wsl2的debian上进行 -
对比
pg是在虚拟机的debian上,安装方法见Debian上安装PostgreSQL
排查
统一服务端编码
\l命令查看,win上的pg:Encoding是utf8,Collate和Ctype是cp932,即gbk;debian上的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达到在windows和debian上的表现完全一致,但通过配置可以达到除连接成功前的错误消息编码外的一致性(至少暂未发现其它不一致处)。