不区分大小写的排序规则仍然使用区分大小写的比较

Case insensitive collation still uses case sensitive comparison

根据 postgress documentation 可以创建排序规则以在比较操作期间忽略大小写。

CREATE COLLATION IF NOT EXISTS case_insensitive (provider = icu, locale = 'und-u-ks-level2', deterministic = false);

create table if not exists testTable(
    id int generated always as identity primary key,
    test_name text collate case_insensitive not null unique
);

insert into testTable(test_name) VALUES('Foo');

select * from testTable WHERE test_name = 'foo'

最后的 select 并不像我期望的那样 return 该行。

这个 StackExchange 问题提到 windows icu 可能是旧的:https://dba.stackexchange.com/questions/255780/case-insensitive-collation-still-comparing-case-sensitive/255783#255783,但即使使用建议的解决方法也不会产生任何结果。

CREATE COLLATION case_insensitive(
  provider = 'icu',
  locale = '@colStrength=secondary',
  deterministic = false
);

我不想设置整个数据库的排序规则,而只是针对单个列。

Windows 10 Version  10.0.19044 Build 19044
PostgreSQL 12.9, compiled by Visual C++ build 1914, 64-bit

以上示例代码适用于 PostgreSQL 14.2, compiled by Visual C++ build 1914, 64-bit

尽管说明直接取自 12.9 文档,但它确实取决于 postgres 版本。