我试图将一个被C#应用程序(+EF6)使用的SQL Server数据库转移到Postgres 12,但我在使大小写不敏感的字符串比较方面并没有太大的成功。现有的SQL Server数据库使用SQL_Latin1_General_CP1_CI_AS排序规则,这意味着所有WHERE子句都不必担心大小写。
我知道以前使用CIText是实现这一目的的方法,但现在已经被非确定性排序规则所取代。
我创建了这样的排序规则;
我知道以前使用CIText是实现这一目的的方法,但现在已经被非确定性排序规则所取代。
我创建了这样的排序规则;
CREATE COLLATION ci (provider = icu, locale = 'und-u-ks-level2', deterministic = false);
当应用于CREATE TABLE的每个列时,它确实起作用 - 不区分大小写。
CREATE TABLE casetest (
id serial NOT NULL,
code varchar(10) null COLLATE "ci",
CONSTRAINT "PK_id" PRIMARY KEY ("id"));
但是根据我所了解的,它必须应用于每个varchar列,不能在整个数据库中全局设置。
这是正确的吗?
我不想到处使用.ToLower()处理,因为这样会导致杂乱无章,而且任何列上的索引也不会被使用。
我尝试修改pg_collation中预先存在的“default”排序规则,使其与“ci”排序规则的设置相匹配,但没有效果。
提前谢谢。
PG
CREATE DATABASE collation_db TEMPLATE template0 ENCODING 'UTF8' ICU_SHORT_FORM = 'AN_CU_EX_NX_LROOT';
这样为每个数据库设置默认的ICU排序规则。在旧文档中有很好的例子(其他版本和格式)。但没有提到不确定性排序规则。 - cachiusCREATE EXTENSION citext;
导入一次,并将格式行更改为format('ALTER TABLE %s ALTER COLUMN %I SET DATA TYPE CITEXT'
。这样做的好处是LIKE、ILIKE和~*
仍然有效,并且通过LIKE
语句启用可移植SQL。 - cachius