代码之家  ›  专栏  ›  技术社区  ›  chryss

为什么使用较短的VARCHAR(n)字段?

  •  8
  • chryss  · 技术社区  · 14 年前

    VARCHAR VARCHAR(255) 字段占用的存储空间不会超过 VARCHAR(10) 现场。

    是否有其他原因限制VARCHAR字段的大小以尽可能地与数据的大小保持一致?我在想

    • 性能:在对数据进行选择、筛选和排序时,使用较小的n是否有好处?
    • 内存,包括应用侧(C++)?
    • 还有别的吗?

    VARCHAR(n) 带n<=255可用; CHAR , NCHAR NVARCHAR TEXT 即使对于实际最大大小永远不会超过30字节左右的数据。

    一个表的典型数据量是1-10百万条记录,最多有150个属性。查询性能( SELECT ,经常广泛 WHERE

    5 回复  |  直到 14 年前
        1
  •  14
  •   Thomas    14 年前
    1. 数据完整性-迄今为止最重要的原因。如果创建一个名为 Surname 这是255个字符,你可能会得到更多的姓氏。你会得到名字,姓氏,中间名。你会得到他们最喜欢的宠物。你会看到“会计部的爱丽丝长着三角形头发”。简言之,您将使用户能够轻松地将该列用作注释/姓氏列。你呢 希望 这个上限是为了阻止那些试图将姓氏以外的内容放入该列的用户。如果您有一列需要特定长度(例如,美国税务标识符是9个字符),但该列是 varchar(255) ,其他开发者会好奇到底发生了什么

    2. 索引和行限制。在SQL Server中,限制为8060字节IIRC。包含大量数据的大量fat non-varchar(max)列可以很快超过该限制。此外,索引的宽度IIRC有900字节的上限。所以,如果你想索引你的姓氏列和其他包含大量数据的列,你可以超过这个限制。

    3. 报告和外部系统。作为报表设计器,您必须假设如果一个列的最大长度为255,则该列可以有255个字符。如果用户能做到,他们就会做到。因此,说“它可能不会超过30个字符”与“它不能超过30个字符”根本不一样。千万不要依赖前者。作为报表设计器,您必须解决用户将一组数据输入列的可能性。这要么意味着截断这些值(如果是这样的话,为什么还要有额外的可用空间呢?),要么使用CanGrow把报表弄得一团糟。无论哪种方式,如果列大小与存储的实际数据相差甚远,都会使其他开发人员更难理解列的意图。

        2
  •  3
  •   Tom H    14 年前

    我认为最大的问题是数据验证。如果您允许255个字符作为姓氏,那么您的数据库中的姓氏将超过200个字符。

    另一个原因是,如果您允许数据库容纳255个字符,那么您现在必须在每个接触数据库的系统中考虑这种可能性。例如,如果导出到固定宽度的列文件,则所有列的宽度都必须为255个字符,这可能会非常烦人甚至有问题。这只是一个可能导致问题的例子。

        3
  •  0
  •   Ralf de Kleine    14 年前

    (例如)在荷兰,一个社会保险号码总是9个字符长,当你不允许更多的时候,它就永远不会出现。

        4
  •  0
  •   Reagan Williams    14 年前

    当您的数据没有长度约束时,您希望开发人员强制执行列数据在长度上都是相似的。在报告该数据时,如果开发人员未能使列数据一致,则会导致报告该数据不一致&看起来很有趣。

    3) SQL Server数据存储

    SQLServer在8k“页面”上存储数据,从性能的角度来看,尽可能高效地在一个页面上存储尽可能多的数据是理想的。

    如果您的数据库设计为将每个字符串列存储为varchar(255),“坏”数据可能会滑入其中一个字段(例如,状态名称可能滑入长度为2个字符的StateCode字段),并导致不必要的&页面和索引拆分效率低下。

        5
  •  0
  •   Jeremy    14 年前

    另一件事是,一行数据被限制为8060字节,SQLServer使用varchar字段的最大长度来确定这一点。

    http://msdn.microsoft.com/en-us/library/ms143432.aspx