pg_trgm在Ubuntu和Mac OS X上的行为有所不同

问题描述 投票:3回答:2

我正在使用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的原因?

macos postgresql ubuntu
2个回答
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;

0
投票

这样做的原因是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",它应该可以工作。
© www.soinside.com 2019 - 2024. All rights reserved.