pg_trgm在Ubuntu和Mac OS X上的表现不同

时间:2016-07-07 15:48:43

标签: macos postgresql ubuntu

我使用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_trgmSELECT * FROM pg_extension版本均为1.1。

有没有人可以帮我找到为什么pg_trgm无法在Mac上使用Unicode?

2 个答案:

答案 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;