【问题标题】:sql varchar(max) vs varchar(fix)sql varchar(max) vs varchar(fix)
【发布时间】:2015-05-12 21:09:28
【问题描述】:

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

我应该将它设置为 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 或 single char 或 null 那我应该拿什么。

另一个人认为我想知道。 nullnot null 之间的主要区别是什么。是否仅用于验证检查以及对性能有什么影响。

【问题讨论】:

  • 如果我选择 [PageContent] [varchar](5000) NOT NULL 它总是需要 5000 字符,无论是 5000 还是小于 5000。

标签: sql sql-server sql-server-2008


【解决方案1】:

MSDN

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

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

赋予类型“varchar”的大小 (10000) 超过了任何数据类型所允许的最大值 (8000)。

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

Here

Varchar[(n)]Varchar(Max) 之间没有太大的性能差异。与Varchar(Max) 相比,Varchar[(n)] 提供了更好的性能结果。如果我们知道要存储在列或变量中的数据小于或等于 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 

【讨论】:

  • 先生,我喜欢你的回答,但我仍然对空间消耗感到困惑。
  • @vicky 您能否详细说明您对空间消耗的担忧?
  • 它将小于 5000 个字符或单个字符或 null。
  • @vicky 如果您确定最大大小为 5000,那么声明您的 varchar 大小小于 5k 也没有意义,因为大小有很多大小变化(单个字符到 5000 或甚至为空)我建议你应该使用 Varchar,你还有什么好的选择?
【解决方案2】:

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

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

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

    一个。出于良好的设计(如果不是性能优势)的原因,以及

    b.因为 VARCHAR(MAX) 数据不压缩

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

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

  4. 将行内 VARCHAR(MAX) 值从超过 8,000 更新到低于 8,000 将比将表设置为存储行外数据更快。

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

【讨论】:

    【解决方案3】:

    “大约 5000” - 如果您不知道,那么设置为最大可能是最好的选择。另一方面,如果你知道它不会超过 6000,你不妨使用这个天花板来节省一些空间。

    这在很大程度上取决于您存储了多少数据、访问了多少数据以及数据的重要性。恐怕没有适合所有人的魔法规则。

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

    【讨论】:

    • 先生,我知道长度。它将少于 5000 个字符并且将为空
    • 正如我和其他人所说,如果您知道它不会超过某个值,您可能应该使用它并设置一个固定值(以节省空间等)。但还有其他事情需要考虑,其中大部分都包含在我们的答案中。
    【解决方案4】:

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

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

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

    【讨论】:

    • 但无论我输入单个字符,它总是需要 5000 个字符空间。
    【解决方案5】:

    先说一下两者的区别

    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 同义词是 national char 和 national character..

    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

    【讨论】:

      猜你喜欢
      • 2011-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-11
      • 2017-08-11
      • 2021-03-22
      • 1970-01-01
      • 2010-12-12
      相关资源
      最近更新 更多