如何使用不区分大小写的排序规则创建 Postgres 数据库

Anu*_*hah 5 postgresql collation postgresql-9.4

我在 Windows 7 64 位上使用 postgres 9.4.1 64 位版本。我需要使用设置“区分大小写 = OFF”来创建数据库,但无法完成这项工作。我已经在 SO 和其他论坛上提出了很多问题,但即使在尝试了所有这些选项之后,我的数据库仍然区分大小写,我的搜索查询仅返回部分结果。

有没有人成功地在 Windows 环境中完成这项工作?

注意:我知道 ILIKE 运算符,但架构师团队不会考虑该选项,因为我们有明确的要求,即默认情况下数据库存储应为 CASE INSENSITIVE。我们没有任何需要区分大小写搜索的场景。

在此处输入图片说明

在此处输入图片说明

小智 6

这对于原始发布者来说可能为时已晚,但为了完整性,从 PostgreSQL 实现不区分大小写的行为的方法是设置一个非确定性排序规则。这仅适用于 Postgres 12。

\n\n

此处的文档描述了详细信息。为了完整性而复制相关部分:

\n\n
\n

排序规则可以是确定性的,也可以是非确定性的。确定性排序规则使用确定性比较,这意味着仅当字符串由相同的字节序列组成时,它才认为字符串相等。非确定性比较可以确定字符串相等,即使它们由不同的字节组成。典型情况包括不区分大小写的比较、不区分重音的比较以及不同 Unicode 范式的字符串比较。由排序规则提供者实际实现这种不敏感的比较;确定性标志仅确定是否使用字节比较来打破关系。有关术语的详细信息,另请参阅 Unicode 技术\n 标准 10。

\n\n

要创建非确定性排序规则,请为 CREATE COLLATION 指定属性\n 确定性 = false,例如:

\n\n
CREATE COLLATION ndcoll (provider = icu, locale = \'und\', deterministic = false);\n
Run Code Online (Sandbox Code Playgroud)\n\n

此示例将以非确定性方式使用标准 Unicode 排序规则。特别是,这将允许正确比较不同范式的字符串。更有趣的\n 示例利用了上面解释的 ICU 自定义工具。\n 例如:

\n\n
CREATE COLLATION case_insensitive (provider = icu, locale = \'und-u-ks-level2\', deterministic = false);\nCREATE COLLATION ignore_accents (provider = icu, locale = \'und-u-ks-level1-kc-true\', deterministic = false);\n
Run Code Online (Sandbox Code Playgroud)\n\n

默认情况下,所有标准和预定义排序规则都是确定性的,所有用户定义的排序规则都是确定性的。虽然非确定性排序规则提供了更正确的行为,特别是在考虑 Unicode 的全部功能及其许多特殊情况时,但它们也有一些缺点。最重要的是,它们的使用会导致性能损失。此外,某些操作无法使用非确定性排序规则进行,例如模式匹配操作。因此,应仅在特别需要的情况下使用它们。

\n
\n


Vér*_*ace 1

您应该看看我最近有关元音变音的相关问题的回答。

\n\n

基本上,该解决方案涉及专有名称的“影子”或“搜索”列。基本上,您使用 ON INSERT 触发器将您希望搜索的字段填充到您的搜索列中,并根据您选择的搜索方法进行修改 - 在本例中,不区分大小写。

\n\n

我给出的例子是使用爱尔兰名字

\n\n
Display_Name    Search_name    Address\n------------    -----------    -------\nRonan MacGuire  RONAN MCGUIRE  1 Clontarf D1\nRonan McGuire   RONAN MCGUIRE  2 Malahide D2\nR\xc3\xb3n\xc3\xa1n Mcguire   RONAN MCGUIRE  3 Mary\'s terrace D3\n
Run Code Online (Sandbox Code Playgroud)\n\n

忽略有关 Mc/Mac 的部分,只需关注最后一个 Display_Name“R\xc3\xb3n\xc3\xa1n Mcguire” - 在 Search_Name 列中,这将更改为 RONAN MCGUIRE - 并且任何对 MCGUIRE 的搜索也将选取第二个人“罗南·麦奎尔”。这样做的优点是与可移植/RDBMS 无关。也许这可以解决您的问题?

\n

  • 如果我需要针对任何特定的表/列,这是一个很好的解决方案。但是,对于我来说,对所有表中的所有字符串列执行此操作确实不切实际。我需要向架构师团队提出一些由数据库引擎本身支持的东西,例如像 SQL Server 那样。 (3认同)