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

标签 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_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/

    相关文章:

    macos - OSX 通知中心图标

    macos - 使用 sed 或 awk 从特定点删除字符直到空格之前

    postgresql - 根据通配符键查询嵌套json

    ruby-on-rails - 优化搜索 RoR

    c++ - Ubuntu 中 getline 的段错误

    java - 运行 javafx 应用程序时没有出现窗口

    linux - 我可以从损坏的 Raspberry Pi sd 恢复文件吗?

    python - PyQt 连接到 Postgresql 并显示值

    apache - 从 access.log 获取前 50 个 IP,包括 IPV6

    linux - 从目录导航回来时 cd && ls bash 函数问题