Postgresql
PostgreSQL 中 UTF8_UNICODE_CI 排序規則的等價物
我想要 PostgreSQL 數據庫內的表中的一列(我使用的是 9.6 版)。我知道
UTF8_UNICODE_CI
MySQL 上的排序規則,所以我嘗試了: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 索引進行了多項改進。