如何为整个 PostgreSQL 数据库甚至整个服务器/集群设置不区分大小写?
UPD:用于列值。我刚刚从 MS SQL 迁移了数据库,现在正在研究如何以最轻松的方式获得类似于我们之前用于排序、过滤和其他内容的行为。
如何为整个 PostgreSQL 数据库甚至整个服务器/集群设置不区分大小写?
UPD:用于列值。我刚刚从 MS SQL 迁移了数据库,现在正在研究如何以最轻松的方式获得类似于我们之前用于排序、过滤和其他内容的行为。
默认情况下,不带引号的标识符不区分大小写(并且根据 SQL 标准)。
除此之外,您不能在标准 Postgres 中设置“不区分大小写”。
CITEXT 绝对是最不痛苦的路线(根据@Matthew Wood 的建议)
使用以下命令将扩展安装到当前数据库:
CREATE EXTENSION IF NOT EXISTS citext;
这在运行这样的查询时非常有用:
SELECT * FROM product WHERE serial_number = 'aB'
这将成功匹配ab
,Ab
或aB
.AB
如果您使用参数化 SQL 并让提供程序为您构建命令,您可能会遇到麻烦。例如,通过以下命令使用 Npgsql(.NET 的 ADO.NET 提供程序):
SELECT * FROM product WHERE serial_number = @serial_number;
实际上将其发送到服务器:
SELECT * FROM product WHERE serial_number = ((E'aB')::text);
这会将值转换为“文本”,这意味着它将进行区分大小写的查找。我设法解决这个问题的方法是修改 Npgsql 源代码以添加“citext”类型。使用此参数类型,将发出正确的命令:
SELECT * FROM product WHERE serial_number = ((E'aB')::citext);
您可以使用 CITEXT 数据类型而不是 VARCHAR/TEXT: