为什么要为字符变化类型指定长度

Mr *_*ubs 14 database postgresql varchar database-design types

参考关于字符类型的Postgres文档,我不清楚指定字符变化(varchar)类型的长度.

假设:

  • 字符串的长度对应用程序无关紧要.
  • 你不在乎有人把这个最大尺寸放在数据库中
  • 你有无限的硬盘空间

它确实提到:

短字符串(最多126个字节)的存储要求是1个字节加上实际字符串,其中包括字符空间填充.较长的字符串有4个字节的开销而不是1.长字符串由系统自动压缩,因此磁盘上的物理要求可能更少.非常长的值也存储在后台表中,因此它们不会干扰对较短列值的快速访问.在任何情况下,可存储的最长字符串大约为1 GB.(数据类型声明中n允许的最大值小于此值.更改此值没有用,因为使用多字节字符编码时,字符数和字节数可能会大不相同.

这是关于字符串的大小,而不是字段的大小,(听起来它总是会压缩大型varchar字段中的大字符串,而不是大型varchar字段中的小字符串?)

我问这个问题,因为指定一个更大的尺寸会更容易(和懒惰),所以你永远不必担心字符串太大.例如,如果我为地名指定varchar(50),我将获得具有更多字符的位置(例如Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch),但如果我指定varchar(100)或varchar(500),我就不太可能得到这个问题.

如果您的最大字符串长达400个字符,那么你会在varchar(500)和(任意)varchar(5000000)或text()之间获得性能影响吗?

如果有人对此有答案并且知道其他数据库的答案,也不感兴趣,请添加它.

我用谷歌搜索,但没有找到足够技术性的解释.

Mar*_*ani 12

我的理解是,使用约束对数据完整性很有用,因此我使用列大小来验证较低层的数据项,并更好地描述数据模型.

关于此事的一些链接:

  • 与使用`varchar(nn)`相比,使用`text`(或`varchar`)以及限制长度的检查约束更加灵活.更改长度限制就像删除和重新创建检查约束一样简单,而将例如varchar(20)扩展到varchar(50)的ALTER TABLE在大型表上可能非常耗时并且对该表进行独占锁定. (9认同)

Sea*_*ins 5

我的理解是,这是旧数据库的遗留物,其存储空间不如Postgres灵活.有些人会使用固定长度的结构来轻松找到特定的记录,并且由于SQL是一种有些标准化的语言,即使它没有提供任何实际的好处,仍然可以看到遗留物.

因此,对于Postgres来说,你的"做大"的方法应该是一个完全合理的方法,但它可能无法很好地转移到其他不太灵活的RDBMS系统.