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

Han*_*nXu 5 postgresql macos ubuntu

pg_trgm用来执行模糊字符串匹配,其中字符可以是中文。奇怪的是,在我的 Ubuntu 服务器上,一切正常,如下:

SELECT show_trgm('???');
> {0xa09182,0xcdfdbb,0x183afe,leD}
Run Code Online (Sandbox Code Playgroud)

但是,在我的 Mac 上,它不起作用:

SELECT show_trgm('???');
> {}
Run Code Online (Sandbox Code Playgroud)

我想这是由于一些奇怪的编码人员,但我检查了我可以想象的所有设置,包括:

SHOW SERVER_VERSION;
SHOW SERVER_ENCODING;
SHOW LC_COLLATE;
SHOW LC_CTYPE;
Run Code Online (Sandbox Code Playgroud)

它在 Ubuntu 上显示的位置:

9.5.1
UTF8
en_US.UTF-8
en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

在 Mac 上它显示:

9.5.3
UTF8
en_US.UTF-8
en_US.UTF-8
Run Code Online (Sandbox Code Playgroud)

此外,pg_trgm根据SELECT * FROM pg_extension.

谁能帮我找出为什么pg_trgm我的 Mac 上的 Unicode 不起作用?

bla*_*ami 1

这样做的原因是,这pg_trgm取决于libc(操作系统附带的系统库)用于分类哪些字符是字母字符、哪些字符不是字母字符的例程,并且(不幸的是)操作系统之间的情况不同。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-8MacOS X 很可能不会将 UTF-8 中文字符分类为该语言环境中的字母(这并不奇怪)。尝试LC_CTYPE="zh_CN.UTF-8"一下,应该会起作用。