# F.8.citext

F.8.1.根本原因F.8.2.如何使用它F.8.3.字符串比较行为F.8.4.局限性F.8.5.著者

这个citext模块提供不区分大小写的字符串类型,citext.本质上,它在内部调用降低比较数值时。否则,它的行为几乎与文本.

# 提示

考虑使用非确定性排序(见第24.2.2.4节)而不是这个模块。它们可以用于不区分大小写的比较、不区分重音的比较和其他组合,并且可以正确处理更多的Unicode特殊情况。

该模块被认为是“受信任的”,也就是说,它可以由拥有创造当前数据库的权限。

# F.8.1.理由

在PostgreSQL中进行不区分大小写匹配的标准方法是使用降低例如,在比较值时使用函数

SELECT * FROM tab WHERE lower(col) = LOWER(?);

这项工作相当不错,但也有一些缺点:

  • 这会使SQL语句变得冗长,而且您必须始终记住使用降低在列和查询值上。

  • 它不会使用索引,除非使用降低.

  • 如果将列声明为唯一的主键,隐式生成的索引区分大小写。因此,它对于不区分大小写的搜索是无用的,而且它不会在不区分大小写的情况下强制唯一性。

    这个citext数据类型允许您消除对降低并允许主键不区分大小写。citext是区域识别的,就像文本,这意味着大小写字符的匹配取决于数据库LC_CTYPE背景同样,这种行为与使用降低在查询中。但是因为它是通过数据类型透明地完成的,所以您不必记住在查询中执行任何特殊操作。

# F.8.2.如何使用它

下面是一个简单的用法示例:

CREATE TABLE users (
    nick CITEXT PRIMARY KEY,
    pass TEXT   NOT NULL
);

INSERT INTO users VALUES ( 'larry',  sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'Tom',    sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'Damian', sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'NEAL',   sha256(random()::text::bytea) );
INSERT INTO users VALUES ( 'Bjørn',  sha256(random()::text::bytea) );

SELECT * FROM users WHERE nick = 'Larry';

这个选择语句将返回一个元组,即使刻痕列被设置为拉里这个问题是为了拉里.

# F.8.3.字符串比较行为

citext通过将每个字符串转换为小写来执行比较(就像降低然后正常比较结果。因此,例如,如果降低将为他们产生相同的结果。

为了尽可能地模拟不区分大小写的排序规则,有citext-一些字符串处理运算符和函数的特定版本。例如,正则表达式操作符~~*在应用于时表现出相同的行为citext例句他们两人都在毫无意识地配合情况。同样的道理也适用于中国!~!~*,以及喜欢操作员~~~~*!~~!~~*.如果您希望区分大小写,可以将运算符的参数转换为文本.

类似地,如果以下所有函数的参数为citext:

  • regexp_match()

  • regexp_matches()

  • regexp_replace()

  • regexp_拆分为_数组()

  • regexp_split_to_table()

  • 替换()

  • 拆分部分()

  • strpos()

  • 翻译()

    对于regexp函数,如果希望区分大小写匹配,可以指定“c”标志以强制区分大小写匹配。否则,你必须投出文本如果您想要区分大小写的行为,请在使用其中一个函数之前。

# F.8.4.局限性

  • citext的箱子折叠行为取决于LC_CTYPE数据库的设置。因此,在创建数据库时,将确定它如何比较值。在Unicode标准定义的术语中,它并不是真正不区分大小写的。实际上,这意味着,只要你对自己的排序感到满意,你就应该对自己的排序感到满意citext这是我的比较。但是,如果数据库中存储了不同语言的数据,一种语言的用户可能会发现,如果排序规则是针对另一种语言的,那么他们的查询结果可能与预期不符。

  • 从PostgreSQL 9.1开始,您可以附加整理规范citext列或数据值。目前,citext运营商将遵守非违约条款整理在比较大小写折叠字符串时使用了规范,但对小写的初始折叠总是根据数据库的LC_CTYPE设置(也就是说核对“默认值”(已给出)。这可能会在未来的版本中更改,以便两个步骤都遵循输入整理规格

  • citext效率不如文本因为运算符函数和B-树比较函数必须复制数据,并将其转换为小写进行比较。而且,只有文本可以支持B树重复数据消除。然而citext比使用降低以获得不区分大小写的匹配。

  • citext如果你需要数据在某些情况下区分大小写,而在其他情况下不区分大小写,这并没有多大帮助。标准答案是使用文本键入并手动使用降低当您需要不敏感地比较大小写时,可以使用函数;如果不经常需要进行不区分大小写的比较,这种方法就可以了。如果大多数情况下需要不区分大小写的行为,并且不区分大小写,请考虑将数据存储为citext并明确地将该专栏文本当你需要区分大小写的比较时。在任何一种情况下,如果希望两种类型的搜索都快速,都需要两个索引。

  • 包含citext操作员必须处于当前状态搜索路径(通常平民的); 如果不是,则正常情况下区分大小写文本将调用运算符。

  • 用于比较的下套管串方法不能正确处理某些Unicode特殊情况,例如,当一个大写字母有两个小写字母等价物时。Unicode区别于案例映射箱子折叠因为这个原因。使用不确定的排序规则,而不是citext正确处理这个问题。

# F.8.5.作者

大卫·E·惠勒<[david@kineticode.com](邮寄至:david@kineticode.com)>

灵感来源于原作citext唐纳德·弗雷泽的模块。