如何处理 PostgreSQL 中的大小写敏感问题
How to deal with Case Sensitivity in PostgreSQL
我有一个颜色代码大师 table,它存储各种独特的颜色值。它有一个应用了 UNIQUE 约束的列 Color_value。但是,它同时接受 'Black' 和 'black' 值。如何处理这种情况?
您可以像这样创建唯一索引:
create unique index unique_color_value on colors(lower(color_value));
也就是说,通过使用仅允许列中的小写值作为开头的约束,让您的数据从一开始就保持一致会简单得多。
create table colors (
...
color_value text
unique
check(color_value = lower(color_value))
)
一个选项是 GMB 的回答中详述的唯一索引。
其他选项是:
使用 citext
扩展名 (case insensitive text) 并使用 citext
数据类型。然后你可以使用一个简单的唯一约束。
使用 PostgreSQL v12 或更高版本,创建不区分大小写的 ICU 排序规则:
CREATE COLLATION german_ci (
LOCALE = 'de_AT@colStrength=secondary',
PROVIDER = 'icu',
DETERMINISTIC = FALSE
);
该示例适用于奥地利德语,请使用您选择的语言或使用 und
与语言无关的排序规则(只要存在这样的事情)。
然后使用常规唯一约束将列定义为 colname text COLLATE german_ci UNIQUE
。
我有一个颜色代码大师 table,它存储各种独特的颜色值。它有一个应用了 UNIQUE 约束的列 Color_value。但是,它同时接受 'Black' 和 'black' 值。如何处理这种情况?
您可以像这样创建唯一索引:
create unique index unique_color_value on colors(lower(color_value));
也就是说,通过使用仅允许列中的小写值作为开头的约束,让您的数据从一开始就保持一致会简单得多。
create table colors (
...
color_value text
unique
check(color_value = lower(color_value))
)
一个选项是 GMB 的回答中详述的唯一索引。
其他选项是:
使用
citext
扩展名 (case insensitive text) 并使用citext
数据类型。然后你可以使用一个简单的唯一约束。使用 PostgreSQL v12 或更高版本,创建不区分大小写的 ICU 排序规则:
CREATE COLLATION german_ci ( LOCALE = 'de_AT@colStrength=secondary', PROVIDER = 'icu', DETERMINISTIC = FALSE );
该示例适用于奥地利德语,请使用您选择的语言或使用
und
与语言无关的排序规则(只要存在这样的事情)。然后使用常规唯一约束将列定义为
colname text COLLATE german_ci UNIQUE
。