我正在使用 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?
最佳答案
原因是 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-8
MacOS X 很可能不会在此语言环境中将 UTF-8 中文字符归类为字母(不足为奇)。试试 LC_CTYPE="zh_CN.UTF-8"
相反,这应该有效。 关于macos - pg_trgm 在 Ubuntu 和 Mac OS X 上的行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38249935/