PostgreSQL 唯一索引和字符串大小写

发布于 2024-10-01 03:19:37 字数 90 浏览 4 评论 0原文

如果我在字段上创建 PostgreSQL 唯一索引,比较默认情况下是否不区分大小写?

如果没有,是否可以要求 PostgreSQL 忽略字符串大小写?

If I create a PostgreSQL unique index on a field, is the comparison case-insensitive by default?

If not, is it possible to ask PostgreSQL to ignore string case?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

天涯离梦残月幽梦 2024-10-08 03:19:37

PostgreSQL 区分大小写。为了做你想做的事,创建一个函数索引。这样说

CREATE UNIQUE INDEX test_upper_idx ON mytable (UPPER(myfield));

,当您在查询中使用 UPPER(myfield) 时,将使用索引。

查看此链接

PostgreSQL is case sensitive. To do what you want create a function index. So say

CREATE UNIQUE INDEX test_upper_idx ON mytable (UPPER(myfield));

That way when you use UPPER(myfield) in your query the index will be used.

See this link

洛阳烟雨空心柳 2024-10-08 03:19:37

另一种方法是使列数据类型为 citext(不区分大小写的文本)。

citext模块提供了一个不区分大小写的字符串类型,citext。本质上,它在比较值时在内部调用lower。否则,它的行为几乎与文本完全相同。

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';

这样你就不需要在创建索引时调用lower函数。

CREATE UNIQUE INDEX index_users_on_nick ON users (nick);

有用的链接:

Another approach would be to make you column data type a citext (case-insensitive text).

The citext module provides a case-insensitive character string type, citext. Essentially, it internally calls lower when comparing values. Otherwise, it behaves almost exactly like text.

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';

This way tou do not need to calll the lower function on the index creation.

CREATE UNIQUE INDEX index_users_on_nick ON users (nick);

Usefull links:

一生独一 2024-10-08 03:19:37
CREATE UNIQUE INDEX ux_table_field ON mytable(UPPER(field))
CREATE UNIQUE INDEX ux_table_field ON mytable(UPPER(field))
旧情别恋 2024-10-08 03:19:37

您应该能够创建基于函数的索引。 (使用字段的UPPER

you should be able to create a function based index. (use the UPPER of the field)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文