在这个答案(https://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database)中,一句话引起了我的注意:
还要记住,在进行索引比较时,CHAR 和 VARCHAR 之间通常存在很大差异
这是否适用/仍然适用于 Postgres?
我发现 Oracle 上的页面声称它CHAR
或多或少是一个别名VARCHAR
,因此索引性能是相同的,但我在 Postgres 上没有发现任何确定性。
在这个答案(https://stackoverflow.com/questions/517579/strings-as-primary-keys-in-sql-database)中,一句话引起了我的注意:
还要记住,在进行索引比较时,CHAR 和 VARCHAR 之间通常存在很大差异
这是否适用/仍然适用于 Postgres?
我发现 Oracle 上的页面声称它CHAR
或多或少是一个别名VARCHAR
,因此索引性能是相同的,但我在 Postgres 上没有发现任何确定性。
CHAR
并且VARCHAR
在 Postgres(和 Oracle)中实现完全相同。使用这些数据类型时速度没有差异。但是,有一个差异会影响性能:
char
总是将列填充到定义的长度。因此,如果您定义一列 aschar(100)
和一个 asvarchar(100)
但每char(100)
列仅存储 10 个字符,则该列为每个值使用 100 个字符(您存储的 10 个字符加上 90 个空格),而该varchar
列仅存储 10 个字符。比较 100 个字符和 100 个字符会比比较 10 个字符和 10 个字符要慢——尽管我怀疑你是否真的可以在 SQL 查询中测量这种差异。
如果您声明两者的长度均为 10 个字符,并且始终在其中存储 10 个字符,那么绝对没有任何区别(这对于 Oracle 和 Postgres 来说是正确的)
所以唯一的区别是为
char
数据类型完成的填充。仅当(且仅当)列定义太宽时(即由于填充而浪费空间) ,上述引用才成立。
char
如果char
总是完全使用列的长度(因此不会发生填充),那么上面的引用是错误的(至少对于 Postgres 和 Oracle)从我的角度来看,
char
数据类型实际上并没有任何实际用途。只需使用varchar
(或text
在 Postgres 中)并忘记它的char
存在。我同意a_horse_with_no_name所说的一切,并且我普遍同意 Erwin 的评论建议:
元数据
除了一个小例外,我唯一使用
char()
的是当我希望元数据说这必须有 x 字符时。虽然我知道char()
只有在输入超过限制时才会抱怨,但我会经常防止在CHECK
约束中出现欠载。例如,我这样做有几个原因,
char(x)
有时用 schema-loaders 推断为固定宽度的列。这可能会对针对固定宽度字符串进行优化的语言产生影响。需要一个我可以在哪里执行此操作的示例,
ENUM
.关于错误
请注意,有些人可能会对限制两侧的错误消息不协调感到不舒服,但这并不困扰我
对比
varchar
此外,我认为上述建议非常适合几乎总是使用
text
的约定。你也问varchar(n)
。我从不使用那个。至少,我不记得我上次使用varchar(n)
.char(n)
,text
which is Effectivevarchar
(无限制)如果我发现一个具有可变长度文本键的规范是有意义的,并且我相信它有一个恒定的最大长度,我也会使用
varchar(n)
。但是,我想不出任何符合该标准的东西。补充说明
char
这里不要混淆"char"
哪个是单字节类型并且具有可靠的性能和节省空间的好处。相关问答:
PostgreSQL
甲骨文
Postgresql 没有用空格填充。
我发现这是最有用的,快速的 3 行解释: