F.7. citext

citext模块提供不区分大小写字符串类型,citext。 从本质上讲,当比较值时,它内部调用lower。 否则,它的操作很像text

F.7.1. 基本原理

当比较值时,在PostgreSQL中执行不区分大小写匹配的标准方法曾使用 lower函数,比如

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

这个执行的相当好,但有一些缺点:

citext数据类型允许你在SQL查询中删除调用lower, 并且允许主键不区分大小写。citext是区域意识, 就像text, 这意味着大写字母和小写字母字符的匹配 依赖于数据库的LC_CTYPE设置规则。 另外,这种操作与查询中lower的使用是相同的。 但是因为它通过数据类型透明地完成, 你无须记得在你的查询中执行任何特别的。

F.7.2. 如何使用它

这是用法的一个简单例子:

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

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

SELECT * FROM users WHERE nick = 'Larry';

SELECT语句将返回一个元组, 尽管nick列被设置为larry, 并且查询为Larry

F.7.3. 字符串比较操作

citext通过转换每个字符串到小写执行比较 (尽管调用lower) 并且然后通常比较结果。因此,比如, 考虑两个字符串相等,如果 lower为了它们可能产生相同结果。

为了尽可能地模拟不区分大小写排序规则, 有一些字符串处理操作符和函数的citext特定版本。 所以,比如,当应用于citext:他们不区分大小写匹配, 正则表达式运算符~~*表现出相同操作。 对于!~ and !~*以及 LIKE运算符~~~~*!~~!~~*同样是真,如果你想要匹配 大小写敏感,你可以投射运算符的参数给text

类似地,如果它们参数是citext,所有下面的函数执行不区分大小写匹配:

对于正则表达式函数, 如果你想要匹配大小写敏感, 你可以声明"c"标记以 强迫大小写匹配。否则,如果你想要大小写敏感操作, 你必须在使用这些函数之一前投射到text

F.7.4. 限制

F.7.5. 作者

David E. Wheeler

灵感来源于Donald Fraser的最初的citext模块。