我正在使用pg_trgm
执行模糊字符串匹配,其中字符可以是中文。奇怪的是,在我的Ubuntu服务器上,一切都很好,如下所示:
SELECT show_trgm('原作者');
> {0xa09182,0xcdfdbb,0x183afe,leD}
但是,在我的Mac上,它不起作用:
SELECT show_trgm('原作者');
> {}
我猜这是由于一些奇怪的编码人员造成的,但是我检查了我可以想象的所有设置,包括:
SHOW SERVER_VERSION;
SHOW SERVER_ENCODING;
SHOW LC_COLLATE;
SHOW LC_CTYPE;
在Ubuntu上显示:
9.5.1
UTF8
en_US.UTF-8
en_US.UTF-8
在Mac上显示:
9.5.3
UTF8
en_US.UTF-8
en_US.UTF-8
此外,根据pg_trgm
,SELECT * FROM pg_extension
版本均为1.1。
[谁能帮我找到为什么pg_trgm
为什么在Mac上无法使用Unicode的原因?
在macOS中,这是字符编码的问题。根据语言,您必须显式标记编码类型。默认的en_US.UTF-8绝对不起作用。所以:
Chinese : LC_CTYPE="zh_CN.UTF-8"
同样,语言环境应相应地更改。虽然,在美国英语中没有中文的编码/解码点]
您可以创建数据库:
CREATE DATABASE mydb WITH ENCODING='UTF8' LC_CTYPE='zh_CN.UTF-8' LC_COLLATE='zh_CN.UTF-8' OWNER=postgres TEMPLATE=template0 CONNECTION LIMIT=-1;
这样做的原因是pg_trgm
取决于libc
(操作系统随附的系统库)例程,用于对哪些字符是字母字符,哪些不是字母字符进行分类,并且(不幸的)这在OS之间是不同的。 Apple Mac OS X以与其他Unix / Unix类系统不同的方式解释UTF-8而闻名。字符分类在每个区域中都不同,并且由类别LC_CTYPE
(和同名的envvar)驱动。
检查postgres=# \l
的输出,您应该看到Ctype
列,该列告诉您如何在数据库中对字符进行分类。
C
(以前在Apple MacOS X上见过,请尝试再次创建数据库,并指定CREATE DATABASE foo ... LC_CTYPE="en_US.UTF-8"
en_US.UTF-8
,则很可能是MacOS X在该区域设置中未将UTF-8汉字归类为字母(不足为奇)。尝试使用LC_CTYPE="zh_CN.UTF-8"
,它应该可以工作。