意外的乱码
在尝试用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
上的表现完全一致,但通过配置可以达到除连接成功前的错误消息编码
外的一致性(至少暂未发现其它不一致处)。