LIKE 不支持 PostgreSQL 不确定性排序规则

Ban*_*kus 10 collation unicode case-sensitive international-components-unicode postgresql-12

我正在使用 Postgresql v12。我创建了一个像这样的排序规则:

CREATE COLLATION ci (provider = icu, locale = 'tr_TR', deterministic = false);
Run Code Online (Sandbox Code Playgroud)

我在表中使用了该排序规则:

create table testtable1 (
    id serial  primary key,
    name text  COLLATE "ci"
);
Run Code Online (Sandbox Code Playgroud)

我插入了示例数据:

insert into testtable1 values(3,'abc');
Run Code Online (Sandbox Code Playgroud)

当我使用 查询该表时LIKE,它返回以下错误:

select name from testtable1 WHERE name LIKE '%a%'  
Run Code Online (Sandbox Code Playgroud)


错误:LIKE SQL 状态不支持非确定性排序规则:0A000

但我需要使用LIKE. 有什么办法允许这样做吗?

Sol*_*zky 10

假设大多数时候自定义的非确定性排序规则适合您,并且您只是偶尔需要一些确定性的排序规则,那么您可以在需要时通过子句简单地提供确定性排序规则COLLATE。例如,在您的情况下,您可以tr-TR-x-icu按如下方式使用排序规则:

select name from testtable1 WHERE name LIKE '%a%' COLLATE "tr-TR-x-icu"
Run Code Online (Sandbox Code Playgroud)

您可以使用问题中发布的示例代码在db<>fiddle上查看此操作的工作演示。

当然,这将区分大小写。为此,您需要使用ILIKE区分大小写的运算符。例如:

select name from testtable1 WHERE name ILIKE '%A%' COLLATE "tr-TR-x-icu"
Run Code Online (Sandbox Code Playgroud)

但是,该=运算符仍然区分大小写,因为语句中定义的排序规则CREATE COLLATION不会改变默认的敏感性,并且默认情况下排序规则是一切敏感的(这与二进制排序规则不同仅供参考)。

要创建使用“tr-TR”区域设置并且区分大小写的排序规则,您需要localeCREATE COLLATION语句中指定属性,如下所示:

locale = 'tr-TR-u-ks-level2'
Run Code Online (Sandbox Code Playgroud)

要查看实际效果,请参阅:db<>fiddle 示例 2

请参阅“ Unicode 技术标准 #35:UNICODE 本地数据标记语言 (LDML),第 5 部分:排序规则”,了解排序规则选项的完整列表。

并且,请访问排序规则信息以获取排序规则相关信息。它主要面向 SQL Server 和 .NET,但也有一些 MySQL 和 PostgreSQL 的东西,并且跨平台和语言的关键概念通常是相同的。