相当于 PostgreSQL 中的 UTF8_UNICODE_CI 排序规则

Dan*_*ray 5 postgresql collation pattern-matching encoding case-sensitive

我想要 PostgreSQL 数据库中表中的一列(我使用的是 9.6 版)。我知道UTF8_UNICODE_CIMySQL上的排序规则,所以我尝试了:

CREATE TABLE thing (
    id    BIGINT PRIMARY KEY
   ,name  VARCHAR(120) NOT NULL COLLATE "UTF8_UNICODE_CI"
);
Run Code Online (Sandbox Code Playgroud)

但我得到:

ERROR: collation "UTF8_UNICODE_CI" for encoding "UTF8" does not exist
Run Code Online (Sandbox Code Playgroud)

环顾四周,我发现pg_collation表格显示了排序规则,其中显示:

=# SELECT * from pg_collation;
 collname | collnamespace | collowner | collencoding | collcollate | collctype
----------+---------------+-----------+--------------+-------------+-----------
 default  |            11 |        10 |           -1 |             |
 C        |            11 |        10 |           -1 | C           | C
 POSIX    |            11 |        10 |           -1 | POSIX       | POSIX
(3 rows)
Run Code Online (Sandbox Code Playgroud)

所以它显然不存在......有没有办法添加它,或获得我想要的行为?(我想搜索WHERE name LIKE '%lala%'匹配'lalá''LÂLÄ'等等)

Erw*_*ter 5

在 Postgres 中,您通常会以不同的方式解决这个问题。

\n

对于初学者来说,只需用于ILIKE不区分大小写的匹配。手册:

\n
\n

ILIKE可以使用关键字来代替LIKE\n根据活动区域设置使匹配不区分大小写。这不属于\nSQL 标准,而是 PostgreSQL 扩展。

\n
\n
WHERE name ILIKE \'%lala%\'\n
Run Code Online (Sandbox Code Playgroud)\n

为此,您不需要不同的排序规则。Trigram 索引支持区分大小写和不区分大小写的模式匹配:

\n\n

或者使用更便携的lower(col) LIKE

\n
WHERE lower(name) LIKE \'%lala%\'  -- pattern must be lower case, too.\n
Run Code Online (Sandbox Code Playgroud)\n\n

citext或者您可以使用附加模块citext提供的特殊数据类型:

\n\n

如果您坚持使用特殊的排序规则,您可以创建自己的排序规则:

\n\n

我不会那样做。

\n

如果您想进一步进行字符串“规范化”(删除所有变音符号),请查看unaccent()

\n\n

您可以将链接答案中的说明结合起来。更多这里:

\n\n

概述:

\n\n
\n

我只想用ILIKE大表的三元组索引并支持它。最好使用最新版本的Postgres 9.6。它对 trigram GIN 索引进行了多项改进。

\n