PostgreSQL数据库在pgAdmin 4中,字段“email”的数据类型应该是什么?

4

当我搜索varchar时,会显示“未找到结果”。

enter image description here我需要知道在postgresql数据库中应选择哪个数据类型用于“电子邮件”。


2
你不应该局限于 GUI 工具。学会使用 SQL 创建表格,这样你就可以使用所有记录的数据类型(包括 UI 不允许选择的别名)。 - user330315
3个回答

4
除了使用VARCHAR(如@Maria所建议的)之外,您可能会从此链接中获得一些见解:https://www.dbrnd.com/2018/04/postgresql-how-to-validate-the-email-address-column/,以及来自https://dba.stackexchange.com/questions/68266/what-is-the-best-way-to-store-an-email-address-in-postgresql的信息。
如果您阅读其中的某些部分,则可以创建自己的函数或约束,这将有助于您更好地理解PSQL。
简而言之,或链接将来可能会更改(无耻地从其中一个链接中获取):
CREATE EXTENSION citext;
CREATE DOMAIN domain_email AS citext
CHECK(
   VALUE ~ '^\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,3}$'
);
-- for valid samples
SELECT 'some_email@gmail.com'::domain_email;
SELECT 'accountant@dbrnd.org'::domain_email;
-- for an invalid sample
SELECT 'dba@aol.info'::domain_email;

正如Neil所指出的那样,它就像使用自定义类型。

CREATE DOMAIN创建新的域。域本质上是一种带有可选约束(对允许值集的限制)的数据类型。 来源

对于那些不熟悉用于检查值的怪异字符的人来说,它是正则表达式模式

以下是在表格中使用的示例:

CREATE TABLE sample_table ( id SERIAL PRIMARY KEY, email domain_email );

-- The following is invalid, because ".info" has 4 characters
-- the regex pattern only allows 2-3 characters
INSERT INTO sample_table (email) VALUES ('sample_email@gmail.info');
ERROR:  value for domain domain_email violates check constraint "domain_email_check"

-- The following query is valid
INSERT INTO sample_table (email) VALUES ('sample_email@gmail.com');
SELECT * FROM sample_table;
 id |         email
----+------------------------
  1 | sample_email@gmail.com
(1 row)

感谢Neil提供的建议。


我非常喜欢你的回答,但我认为加入一个使用你在这里创建的域来定义列数据类型的CREATE TABLE会更完整。 - Neil Gaetano Lindberg
抱歉,您的意思是我编辑我的评论并添加一个包含我的建议解决方案的CREATE TABLE示例?如果是这样,那么我会进行编辑=)否则,请重新表达您的意思。抱歉,英语不是我的母语,就像我们中的大多数人一样。 - MikeTheSapien
是的,我建议进行编辑。我刚刚发现这很有用,但并不确定如何在表创建中立即使用域。结果就像使用自定义类型一样。在我回复的时候,我已经创建了我的第一个域。 - Neil Gaetano Lindberg

4

过去我使用文本varchar字符变量


1
varchar选项不可用,但有character varying。我应该选择character varying吗? - Saket Suraj
3
@SaketSuraj说:varchar在Postgres中是一种有效的数据类型(它是character varying的别名)。https://dbfiddle.uk/?rdbms=postgres_12&fiddle=d8c0bf80f3e989d92fbf69da7cc553bc - user330315
是的,varcharcharacter varying 的别名。当然你可以使用 character varying。最初我也使用了它,但后来我更喜欢使用 varchar,特别是如果你需要限制长度(这种情况下使用 varchar(N) 或简单的 text)。 - Maria
您可以限制字符变量的长度,例如character varying(150)是有效的。 - user330315

1

我建议您使用CITEXT类型,该类型在值比较中忽略大小写。对于电子邮件来说,这很重要,以防止重复,例如username@example.comUserName@example.com

此类型是citext扩展的一部分,可以通过以下查询激活:

CREATE EXTENSION citext;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接