2011-09-06 88 views
13

参考关于Character Types的Postgres文档,我不清楚指定字符变化(varchar)类型的长度。为什么指定字符变化类型的长度

假设:

  • 字符串的长度,不要紧的应用。
  • 你不在乎别人把数据库中的最大尺寸
  • 你有无限的硬盘空间

它确实提到:

的短字符串的存储需求(最多126字节)为1字节 加上实际字符串,其中包括字符 的空格填充。较长的字符串具有4字节的开销而不是1. 长字符串被系统自动压缩,因此磁盘上的物理需求可能会更少。非常长的值也存储在背景表中,因此它们不会影响对较短列值的快速访问。无论如何,可以存储的最长可能的 字符串大约为1 GB。 (在数据类型声明中允许为n的最大值为 小于 那么改变它是没有用的,因为使用多字节 字符编码的字符数和字节数可以相当 不同

这谈论串的大小,而不是字段的大小(即听起来像它会永远压缩在一个大的varchar字段一个大的字符串,而不是在一个大的varchar字段小弦?)

我问这个问题,因为它会更容易(和懒惰)指定一个更大的大小,所以你永远不必担心有一个字符串太l ARGE。例如,如果我为地名指定varchar(50),我将获得具有更多字符的位置(例如Llanfairpwllgwyngyllgogerychwyrndrobwllllantysiliogogogoch),但是如果指定varchar(100)或varchar(500),我不太愿意得到该问题。

如果你最大的字符串是400字符长,那么你会在varchar(500)和(任意)varchar(5000000)或text()之间得到性能命中吗?

如果任何人有答案,并且知道其他数据库的答案,请加上。

我已经使用了Google,但没有找到足够的技术性解释。

回答

11

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

对此事的一些链接:

+8

与使用'varchar(nn)'相比,使用'text'(或'varchar')以及限制长度的检查约束更灵活一些。改变长度限制就像删除和重新创建检查约束一样简单,而一个ALTER TABLE可以扩展例如varchar(20)到varchar(50)在大型表上非常耗时,并在该表上放置排他锁。 –

+0

伟大的链接...! –

5

我的理解是,这是旧数据库存储的遗留问题,并不像Postgres那样灵活。有些人会使用固定长度的结构来很容易地找到特定的记录,而且由于SQL是一种有点标准化的语言,即使它没有提供任何实际的好处,它仍然可以看到。因此,对于Postgres,您的“变大”方法应该是一个完全合理的方法,但它可能无法很好地传递给其他不太灵活的RDBMS系统。

2

文档解释了这一点:

如果字符改变我在没有使用长度说明符的情况下,该类型接受任何大小的字符串。后者是PostgreSQL扩展。

SQL标准要求所有类型的长度规范。这可能主要是出于遗留原因。在PostgreSQL用户中,首选项倾向于省略长度说明,但如果要编写可移植代码,则必须包含它(并在许多情况下选择任意大小)。

1

另外两个想法:

  1. Postgres的医生说那是很长的值也存储在后台表“。因此,将所有字符串定义为无界可能会将它们推送到背景表格中 - 当然,性能会受到影响。

  2. 声明一切都很长会干扰DB预测查询执行计划的努力,因为它对数据的了解较少。

  3. 构建一个包含索引的b-tree也会被抛弃,因为它无法猜测合理的打包策略。例如,如果性别是TEXT,你怎么知道它全是M或F?

相关问题