为什么不使用varchar(max)?

Ata*_*oss 72 sql t-sql sql-server-2008 varcharmax

在数据库设计方面,我有点老了,所以我完全在列中使用正确的数据大小.但是,在为朋友查看数据库时,我注意到他使用varchar(max)了很多.现在,我的想法是把它扔回给他并告诉他改变它.但后来我想到了它并且没有提出他不使用它的充分理由(如果你想知道的话,他会使用案例类型工具来生成数据库).

我一直在研究使用的主题,varchar(max)我不能真正想出他不使用它的任何理由.

他没有将列用于索引,位于数据库上的应用程序对输入有限制,因此它不允许在字段中使用大量条目.

任何帮助将不胜感激,以帮助我让他看到光:).

Rus*_*rke 34

我对此的回答不是关于Max的用法,而是关于VARCHAR(max)vs TEXT的原因.

在我的书中; 首先,除非你绝对可以肯定你永远不会编码除英文文本以外的任何内容,而且人们不会引用外国地名,那么你应该使用NVARCHAR或NTEXT.

其次,这是领域允许你做的事情.

与VARCHAR相比,TEXT很难更新,但您可以获得全文索引和许多聪明的东西.

另一方面,VARCHAR(MAX)有一些模糊性,如果单元格的大小<8000个字符,它将被视为行数据.如果它更大,它将被视为用于存储目的的LOB.因为如果不查询RBAR就无法知道这一点,这可能会为您需要确定数据以及需要花费多少读取的地方提供优化策略.

否则,如果您的使用相对平凡,并且您不希望数据大小有问题(您正在使用.Net的IE,因此不必担心您的字符串/ char*对象的大小)那么使用VARCHAR(max)就可以了.

  • 这个答案似乎暗示全文索引只能与`text`数据类型一起使用.不是这种情况.`text`是一种不推荐使用的数据类型,并且没有优于`varchar(max)`AFAIK的优势. (13认同)
  • 不使用TEXT/NTEXT的另一个原因是它们已被弃用. (6认同)
  • 我在阅读有关它的文章时注意到的一件事是,当你查询一个表时,它必须缓冲内存中记录的最大大小.所以这可能是一个问题,但在今天的环境中有多个演出(如果不是太字节)并且ram便宜且易于升级,它几乎可以将这个问题简化为无. (4认同)
  • [MSSQL 联机丛书](https://docs.microsoft.com/en-us/sql/t-sql/data-types/ntext-text-and-image-transact-sql):_ntext、文本和图像数据类型将在 Microsoft SQL Server 的未来版本中删除。避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。请改用 nvarchar(max)、varchar(max) 和 varbinary(max)。_ (2认同)

Shi*_*iji 12

有一篇关于为什么不在这里使用varchar max的博客文章

编辑

基本区别在于存储数据的位置.SQL数据行的最大大小为8000字节(或者是8K).然后,2GB varchar(max)无法存储在数据行中.SQL Server将其"存储在行外".

因此,您可能会因为数据不在磁盘上的相同位置而受到性能影响,请参阅:http://msdn.microsoft.com/en-us/library/ms189087.aspx

  • 当您无法预测可能需要插入行的字符串大小时,性能损失值得操作正确. (2认同)