F.9. citext

citext模块提供了不区分大小写的字符串类型citext。本质上,当比较值时,它内部调用lower。否则,它的行为几乎与text类似。

F.9.1. Rationale

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

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

这可以很好地工作,但是有很多缺点:

citext数据类型使您可以消除 SQL 查询中对lower的调用,并使主键不区分大小写。 citexttext一样具有区域设置意识,这意味着大写和小写字符的匹配取决于数据库LC_CTYPE设置的规则。同样,此行为与在查询中使用lower相同。但是,由于它是按数据类型透明完成的,因此您不必记住在查询中要做任何特殊的事情。

F.9.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';

即使nick列设置为larry且查询是针对Larry的,SELECT语句也将返回一个 Tuples。

F.9.3. 字符串比较行为

citext通过将每个字符串转换为小写字母(好像调用了lower)来进行比较,然后正常地比较结果。因此,例如,如果lower为它们产生相同的结果,则认为两个字符串相等。

为了尽可能接近地模拟不区分大小写的排序规则,许多字符串处理运算符和函数都具有特定于citext的版本。因此,例如,将正则表达式运算符~~*应用于citext时,它们表现出相同的行为:它们都区分大小写,不区分大小写。 !~!~*以及LIKE运算符~~~~*以及!~~!~~*也是如此。如果要区分大小写匹配,可以将运算符的参数强制转换为text

同样,以下所有函数的参数均为citext时,将不区分大小写地执行匹配:

对于 regexp 函数,如果要区分大小写,可以指定“ c”标志来强制区分大小写。否则,如果要区分大小写,则必须在使用这些功能之一之前强制转换为text

F.9.4. Limitations

F.9.5. Author

戴维·惠勒<david@kineticode.com>

受到 Donald Fraser 最初的citext模块的启发。

上一章 首页 下一章