4

在创建 varchar 或 varbinary 列时为 max 选择较大值有什么缺点?

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

谢谢

4

3 回答 3

6

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

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

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

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

[1] varchar(max) 有点特殊,但如果字段长度 > 8000 或行 > 8060,也会分配溢出页。这是 MSSQL 的默认值,行为会随着大类型而改变在数据行选项中。

于 2009-01-23T23:48:22.587 回答
0

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

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

于 2009-01-23T23:34:04.693 回答