为varchar或varbinary选择大MAX值的缺点

时间:2009-01-23 23:24:26

标签: sql sql-server types varchar

在创建varchar或varbinary列时选择max值为max的缺点是什么?

我正在使用MS SQL,但我认为这也与其他dbs相关。

由于

3 个答案:

答案 0 :(得分:6)

这取决于在特定列中存储大量数据是否合理。

如果您声明一个永远不会正确存储大量数据的列(即员工名字作为VARCHAR(1000)),您最终会遇到各种问题

  1. 许多(如果不是大多数客户端API)(即ODBC驱动程序,JDBC驱动程序等)在客户端上分配大到足以存储特定列的最大大小的内存缓冲区。因此,即使数据库只需存储实际数据,也可能会大大增加客户端应用程序使用的内存量。
  2. 您无法从表定义中驱动数据验证规则(或传递有关数据的信息)。如果数据库允许1000个字符的名字,那么与数据库交互的每个应用程序可能最终都有自己的规则来确定员工名称的大小。如果通过在所有应用程序和表之间放置存储过程层来减轻这种情况,这通常会导致各种应用程序具有各种规则。
  3. 墨菲定律指出,如果你允许1000个字符,有人最终会在列中存储1000个字符,或者至少是一个足以在一个或多个应用程序中导致错误的值(即没有人检查是否每个应用程序的员工姓名)字段可以显示1000个字符)。

答案 1 :(得分:4)

取决于RDBMS。 IIRC,MySql为varchars分配2字节开销> 255个字符(用于跟踪varchar长度)。 MSSQL< = 2000允许您分配行大小> 8060字节,但如果您尝试INSERT或UPDATE实际超过8060字节的行,则会失败。 SQL 2005 [1]允许插入,但会为溢出分配一个新页面并留下指针。这显然会影响绩效。

[1] varchar(max)在某种程度上是一种特殊情况,但如果字段长度为> 1,则还会分配溢出页面。 8000或行> 8060.这是MSSQL默认值,行为可以随数据行选项中的大类型而改变。

答案 2 :(得分:0)

如果以某种方式获得大量数据(例如来自外部接口)并且您的应用程序无法处理它,您可能会增加破坏应用程序的风险。

作为一个好的设计,您应该始终将字段的大小限制为实际值。