Postgresql

PostgreSQL 中 UTF8_UNICODE_CI 排序規則的等價物

  • December 2, 2016

我想要 PostgreSQL 數據庫內的表中的一列(我使用的是 9.6 版)。我知道UTF8_UNICODE_CIMySQL 上的排序規則,所以我嘗試了:

CREATE TABLE thing (
   id    BIGINT PRIMARY KEY
  ,name  VARCHAR(120) NOT NULL COLLATE "UTF8_UNICODE_CI"
);

但我得到:

ERROR: collation "UTF8_UNICODE_CI" for encoding "UTF8" does not exist

仔細閱讀,我發現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)

所以它顯然不存在……有沒有辦法添加它,或者獲得我想要的行為?(我希望搜尋WHERE name LIKE '%lala%'匹配'lalá','LÂLÄ'等)

在 Postgres 中,您通常會以不同的方式解決這個問題。

對於初學者,僅**ILIKE**用於不區分大小寫的匹配。手冊:

ILIKE根據活動區域設置,可以使用關鍵字而不是LIKE使匹配不區分大小寫。這不在 SQL 標準中,而是 PostgreSQL 擴展。

WHERE name ILIKE '%lala%'

為此,您不需要不同的排序規則。Trigram 索引支持區分大小寫和不區分大小寫的模式匹配:

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

WHERE lower(name) LIKE '%lala%'  -- pattern must be lower case, too.

citext或者您可以使用附加模組citext提供的特殊數據類型:

如果您堅持特殊的排序規則,您可以創建自己的:

我不會那樣做。

如果您想將字元串“標準化”更進一步(刪除所有變音符號),請查看unaccent()

您可以將兩者結合起來,連結答案中的說明。更多在這裡:

概述:


我只會使用ILIKE和支持大表的 trigram 索引。最好使用最新版本的 Postgres 9.6。它對 trigram GIN 索引進行了多項改進。

引用自:https://dba.stackexchange.com/questions/156907