Dan*_*ray 5 postgresql collation pattern-matching encoding case-sensitive
我想要 PostgreSQL 数据库中表中的一列(我使用的是 9.6 版)。我知道UTF8_UNICODE_CI
MySQL上的排序规则,所以我尝试了:
CREATE TABLE thing (
id BIGINT PRIMARY KEY
,name VARCHAR(120) NOT NULL COLLATE "UTF8_UNICODE_CI"
);
Run Code Online (Sandbox Code Playgroud)
但我得到:
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
所以它显然不存在......有没有办法添加它,或获得我想要的行为?(我想搜索WHERE name LIKE '%lala%'
匹配'lalá'
,'LÂLÄ'
等等)
在 Postgres 中,您通常会以不同的方式解决这个问题。
\n对于初学者来说,只需用于ILIKE
不区分大小写的匹配。手册:
\n\n\n
ILIKE
可以使用关键字来代替LIKE
\n根据活动区域设置使匹配不区分大小写。这不属于\nSQL 标准,而是 PostgreSQL 扩展。
WHERE name ILIKE \'%lala%\'\n
Run Code Online (Sandbox Code Playgroud)\n为此,您不需要不同的排序规则。Trigram 索引支持区分大小写和不区分大小写的模式匹配:
\n或者使用更便携的lower(col) LIKE
WHERE lower(name) LIKE \'%lala%\' -- pattern must be lower case, too.\n
Run Code Online (Sandbox Code Playgroud)\n\ncitext
或者您可以使用附加模块citext提供的特殊数据类型:
如果您坚持使用特殊的排序规则,您可以创建自己的排序规则:
\n\n我不会那样做。
\n如果您想进一步进行字符串“规范化”(删除所有变音符号),请查看unaccent()
:
您可以将链接答案中的说明结合起来。更多这里:
\n\n概述:
\n\n我只想用ILIKE
大表的三元组索引并支持它。最好使用最新版本的Postgres 9.6。它对 trigram GIN 索引进行了多项改进。
归档时间: |
|
查看次数: |
10043 次 |
最近记录: |