在 Twitter 交流中,Simon West向Brandur询问,
出于兴趣,为什么要使用
email TEXT CHECK (char_length(email) <= 255)
而不是email VARCHAR(255)
?不是我以前见过的模式
布兰杜尔回应说,
好问题!
(1) VARCHAR 和 TEXT 在 Postgres 中的性能相同(请参阅https://www.postgresql.org/docs/current/static/datatype-character.html上的“提示”框……)。 .
(2) 如果你想改变长度,
ALTER TABLE
需要一个独占锁(见https://www.postgresql.org/docs/current/static/sql-altertable.html ...)。改变CHECK
是瞬间的。当回答一个引起质疑的问题text CHECK (char_length(email) <= 255)
时varchar(255)
两个声明中的第一个声明(粗体)是否严格正确?
如果对第二个索赔感兴趣,请查看此问题。
不,严格来说这不是真的。这是链接文档所说的,
所以本质上
varchar
over 。text
这在某些数据库中是不正确的,即那些实现类似VARCHAR(max)
.varchar(x)
overtext CHECK ( length(x) <= x)
例子
你可以很容易地看到这一点,
注意,
char_length
和length
这里是一样的。他们在内部调用textlen
.结果
在每种情况下,插入
bar
速度较慢重新检查类型约束
我也会认为支票会转移到使用相同类型的表格中。这种优化也许有朝一日是可能的,但遗憾的是,没有喜悦,
虽然 varchar 形式仍然明显更快。
其他注意事项
由于它与推文主题的电子邮件有关,因此这篇文章也可能很有用。