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”区域设置并且区分大小写的排序规则,您需要locale
在CREATE 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 的东西,并且跨平台和语言的关键概念通常是相同的。