我使用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? p>
答案 0 :(得分: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"
,应该可以。答案 1 :(得分:1)
在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;