在PostgreSQL中,varchar(n)是否节省内存空间?

5
如果我定义一个 varchar(25),并且我的字符串长度小于25个字符(例如12个字符),SQL 将以 12 的长度显示字符向量,并且没有添加尾随空格(与字符不同)。
我的问题是:除了 SQL 只显示插入字段的字符串(如果超过了最大长度,则截断字符串)这一事实之外,Postgresql 是如何存储这种数据类型的?
它是否使用额外的字节进行填充,例如:

twelvecharxx............. (长度 : 25)

还是只存储12个字节?
我认为这在内部可能更加复杂。我只需要知道 maximum-length 可选参数是否是禁止存储大型字符串的安全措施,还是仅涉及性能问题(关于所有存储的子序列字符串都预计少于或等于25个字符)。

1
下投票者:请解释一下你的行为。 - vdegenne
1
不是我干的,但这很可能是“常见问题解答”和“在手册中有说明”的结合体。 - Craig Ringer
2个回答

5
SQL定义了两种主要的字符类型:character varying(n)和character(n),其中n是一个正整数。这两种类型都可以存储长度为n个字符的字符串。如果试图将超过这些类型列的字符串存储到列中,除非多余的字符都是空格,否则会导致错误,在这种情况下,字符串将被截断到最大长度。(这种有点奇怪的例外是SQL标准所必需的。)如果要存储的字符串比声明的长度短,那么character类型的值将会填充空格;而character varying类型的值将仅存储较短的字符串。
对于短字符串(最多126字节),存储要求为1个字节加上实际字符串,包括在character情况下的空格填充。而长字符串的开销为4个字节,而不是1个字节。
最后。

提示:这三种类型之间没有性能差异,除了在使用填充空格类型时增加存储大小外,在将数据存入长度受限列时还需要一些额外的循环来检查长度。虽然在其他一些数据库系统中,字符(n)具有性能优势,但在PostgreSQL中并没有这样的优势。

来源于这里


0
根据文档,对于varchar类型的数据,不会存储填充。但是对于character类型的数据,会存储填充。此外,在存储字符串长度时还需要一些开销。

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