3

如果我定义 avarchar(25)并且我的字符串少于 25 个字符(例如 12 个字符),SQL 将 char 的向量显示为长度为 12 并且不添加尾随空格(与字符不同)。

我的问题如下:在 SQL 仅显示插入字段中的字符串(如果长度超过最大长度则截断)这一事实背后,Postgresql 如何存储这种数据类型?

是否用额外的字节填充为:

十二字符 ......(长度:25)

还是只存储 12 个字节?

我认为这在内部可能会更复杂。我只需要知道maximum-length可选参数是否是禁止大字符串存储的安全性,还是只是一个性能问题(关于是否所有子序列存储的字符串都应小于或等于 25 个字符)。

4

2 回答 2

3

SQL 定义了两种主要的字符类型:character varying(n) 和 character(n),其中 n 是一个正整数。这两种类型都可以存储最长为 n 个字符的字符串。尝试将较长的字符串存储到这些类型的列中将导致错误,除非多余的字符都是空格,在这种情况下,字符串将被截断为最大长度。(这个有点奇怪的例外是 SQL 标准所要求的。)如果要存储的字符串比声明的长度短,字符类型的值将被空格填充;字符变化类型的值将仅存储较短的字符串。

短字符串(最多 126 个字节)的存储要求是 1 个字节加上实际字符串,其中包括字符情况下的空格填充。较长的字符串有 4 个字节的开销,而不是 1 个。

最后

提示:这三种类型之间没有性能差异,除了在使用空白填充类型时增加了存储大小,以及在存储到长度受限的列时需要几个额外的周期来检查长度。虽然 character(n) 在其他一些数据库系统中具有性能优势,但在 PostgreSQL 中没有这样的优势。

这里

于 2013-05-13T14:57:40.447 回答
0

varchar根据文档,没有存储填充。然而,因为character它是。存储字符串的长度也有一些开销。

于 2013-05-13T14:56:40.973 回答