sql varchar(max)vs varchar(fix)

时间:2015-03-11 07:07:14

标签: sql sql-server

每次我都对选择varchar(max)或varchar(fix)数据类型感到困惑。假设我有一个大约5000 varchar的数据列。列不是null类型。

我应该设置varchar(max)not null或varchar(5000)not null。

在可以为空的数据类型的情况下也是如此。

CREATE TABLE [dbo].[tblCmsPages](
[CmsPagesID] [int] IDENTITY(1,1) NOT NULL,
[PageName] [varchar](250) NOT NULL,
[PageContent] [varchar](max) NOT NULL,
[Sorting] [int] NOT NULL,
[IsActive] [bit] NOT NULL) 

//或

CREATE TABLE [dbo].[tblCmsPages](
[CmsPagesID] [int] IDENTITY(1,1) NOT NULL,
[PageName] [varchar](250) NOT NULL,
[PageContent] [varchar](5000) NOT NULL,
[Sorting] [int] NOT NULL,
[IsActive] [bit] NOT NULL

// [PageContent]将是5000个char或单个char或null然后应该采取什么。

彼此认为我想知道。 null not null 之间的主要区别是什么?它仅用于验证检查以及对性能的影响。

5 个答案:

答案 0 :(得分:9)

MSDN

  • 当列数据条目的大小变化时使用varchar 相当。
  • 当列数据条目的大小变化时,使用varchar(max) 相当大,大小可能超过8,000字节。

如果在声明VARCHAR变量或列时指定了长度,则允许的最大长度为 8000 。如果长度大于 8000 ,则必须使用MAX说明符作为长度。如果指定的长度大于 8000 ,则会遇到以下错误(假设指定的长度为 10000 ):

  

给'varchar'类型的大小(10000)超过了任何数据类型允许的最大值(8000)。

更新: - 我找到了一个我想分享的链接: -

Here

Varchar[(n)]Varchar(Max)之间的性能差异不大。与Varchar[(n)]相比,Varchar(Max)提供了更好的效果结果。如果我们知道要存储在列或变量中的数据小于或等于8000个字符,那么与Varchar(Max)相比,使用此Varchar [(n)]数据类型可提供更好的性能。例如:当我运行下面的时候脚本通过将变量@FirstName类型更改为Varchar(Max)然后对于100万个分配,它始终比我们使用数据类型时花费的时间加倍

Varchar(50) for variable @ FirstName.
DECLARE @FirstName VARCHAR(50), @COUNT INT=0, @StartTime DATETIME = GETDATE()
WHILE(@COUNT < 1000000)
BEGIN
SELECT @FirstName = 'Suraj', @COUNT = @COUNT +1
END
SELECT DATEDIFF(ms,@StartTime,GETDATE()) 'Time Taken in ms'
GO 

答案 1 :(得分:5)

你对数据有清晰的认识,它不会超过5000,我更喜欢varchar(n)(varchar(5000)。

如果您想在varchar(n)和varchar(max)之间进行选择,请注意以下几点:

  1. 在适当的情况下,使用VARCHAR(n)而不是VARCHAR(MAX)

    一个。出于良好设计的原因,如果没有性能优势,

    湾因为VARCHAR(MAX)数据不压缩

  2. 存储大字符串比存储小字符串需要更长的时间。

  3. 将行内VARCHAR(MAX)值从低于8,000更新为超过8,000将相对较慢,但单个事务的差异可能无法衡量。

  4. 将行内VARCHAR(MAX)值从8,000以上更新到8,000以下将比将表设置为在行外存储数据更快。

  5. 使用VARCHAR(MAX)的行外选项会导致写入速度变慢,直到字符串很长。

答案 2 :(得分:4)

&#34;约5000&#34; - 如果你不知道,那么设置为max可能是最好的选择。另一方面,如果你知道它不会超过6000,你也可以使用这个天花板来节省一些空间。

这在很大程度上取决于您存储的数据量,访问量以及重要性。没有适合我所害怕的所有魔法规则。

允许null或not null:在大多数情况下,我个人更喜欢允许null。首先,null意味着什么,其次我更喜欢在前端设置这样的限制。但这取决于当然存储的数据。

答案 3 :(得分:2)

varchar越大,数据库所需的空间就越大。 最佳做法是尽可能少地分配空间,因此,在您的情况下,第二个代码更好。

[PageContent] [varchar](5000) NOT NULL,

在这种情况下,您不能在列中存储超过5000个字符。

答案 4 :(得分:2)

首先让我区别

  

nvarchar列可以存储任何Unicode数据。 varchar列仅限于8位代码页。有些人认为应该使用varchar,因为它占用的空间更少。我相信这不是正确的答案。代码页不兼容性很痛苦,Unicode可以解决代码页问题。现在有了廉价的磁盘和内存,实际上没有理由浪费时间来处理代码页了。

     

所有现代操作系统和开发平台都在内部使用Unicode。通过使用nvarchar而不是varchar,您可以避免每次读取或写入数据库时​​都进行编码转换。转换需要时间,并且容易出错。从转换错误中恢复是一个非常重要的问题。

     

如果您与仅使用ASCII的应用程序连接,我仍然建议在数据库中使用Unicode。操作系统和数据库整理算法将更好地与Unicode一起使用。 Unicode避免了与其他系统连接时的转换问题。你将为未来做准备。您可以随时验证您的数据是否仅限于7位ASCII,以用于您必须维护的任何遗留系统,即使在享受完整Unicode存储的一些优势的同时也是如此。

如果您使用固定大小假设5000,那么只有当文本长度增加时才能存储高达5000,然后您将收到错误消息。 所以[PageContent] [varchar](max) NOT NULL,更好但是如果你确定字符串长度不会增加超过5000然后[PageContent] varchar NOT NULL更好

nchar [ ( n ) ]定长的Unicode字符串数据。 n定义字符串长度,并且必须是1 through 4,000的值。存储大小是n个字节的两倍。当排序规则代码页使用双字节字符时,存储大小仍为n个字节。根据字符串,n个字节的存储大小可能小于为n指定的值。 nchar的ISO同义词是国家字符和国家字符..

nvarchar [ ( n | max ) ]可变长度的Unicode字符串数据。 n定义字符串长度,可以是1到4,000之间的值。 max表示最大存储空间大小为2 ^ 31-1字节(2 GB)。存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。 nvarchar的ISO同义词是国家字符变化和国家字符变化。

根据我使用nvarchar [ ( n | max ) ]所以你不会依赖字符串长度

参考:了解更多信息https://msdn.microsoft.com/en-IN/library/ms186939.aspx