【问题标题】:nvarchar(max) vs NTextnvarchar(max) 与 NText
【发布时间】:2011-01-09 04:32:12
【问题描述】:

在 SQL Server 中使用nvarchar(max)NText 数据类型的优缺点是什么?我不需要向后兼容,所以在较旧的 SQL Server 版本中不支持 nvarchar(max) 很好。

编辑:显然这个问题也适用于TEXTIMAGEvarchar(max)varbinary(max),对于那些稍后搜索这些数据类型的人。

【问题讨论】:

    标签: sql-server sql-server-2005 sql-server-2008 text nvarchar


    【解决方案1】:

    VARCHAR(MAX) 足以容纳TEXT 字段。 SQL Server 2000 的TEXTNTEXTIMAGE 数据类型将在SQL Server 的未来版本中被弃用,SQL Server 2005 提供了对数据类型的向后兼容性,但建议使用新的数据类型VARCHAR(MAX)NVARCHAR(MAX)VARBINARY(MAX)

    【讨论】:

      【解决方案2】:

      优点是您可以在nvarchar(max) 上使用LENLEFT 之类的函数,而不能针对ntexttext 这样做。使用nvarchar(max) 也比使用text 更容易,因为你必须使用WRITETEXTUPDATETEXT

      另外,textntext 等正在被弃用 (http://msdn.microsoft.com/en-us/library/ms187993.aspx)

      【讨论】:

      • SQL Server 2016 显然仍会支持它们。
      • @Confluence 从历史上看,就 SQL Server 中的存在而言,text 和 nText 数据类型是否比 varchar 和 nvarchar 旧?
      • 您不必使用 WRITETEXT 和 UPDATETEXT。也许在 2010 年你做到了!有兴趣了解更多信息。
      【解决方案3】:

      nvarchar(max) 是您想要使用的。最大的优点是您可以在此数据类型上使用所有 T-SQL 字符串函数。这对于ntext 是不可能的。我不知道有什么真正的缺点。

      【讨论】:

      • 我不明白的是他们说要使用nvarchar(max),但这将我限制为 4000 个字符。如果我希望一个字段包含更多内容怎么办?
      • nvarchar(max) 不限制您使用 4000 个字符。你有无限数量的字符。此外,SQL Server 已弃用 text 和 ntext。这意味着在未来的版本中,它们将不再受支持。
      • OIC,我使用的是 SQL Server CE,它确实将我的 nvarchar(max) 限制为 4000 个字符。所以对于 SQL Server Compact,在某些情况下我别无选择,只能使用 ntext。当他们停止使用它时,我想我将不必升级某些网站。
      • @RandyMinder nvarchar(max) 不是无限存储。根据 SQL Server 文档,“max 表示最大存储大小为 2^31-1 字节 (2 GB)。存储大小(以字节为单位)是输入数据实际长度的两倍 + 2 字节。”
      【解决方案4】:

      Text(连同NTextImage)的最大缺点是它将在SQL Server 的未来版本中被删除,如the documentation。当该版本的 SQL Server 发布时,这将有效地使您的架构更难升级。

      【讨论】:

        【解决方案5】:

        你显然应该使用nvarchar(max)

        MSDN

        【讨论】:

          【解决方案6】:

          ntext 将始终将其数据存储在单独的数据库页面中,而nvarchar(max) 将尝试将数据存储在数据库记录本身中。

          所以nvarchar(max) 会更快一些(如果您的文本小于 8 kB)。我还注意到数据库大小会稍微变慢,这也很好。

          nvarchar(max)

          【讨论】:

            【解决方案7】:

            我想补充一点,您可以使用.WRITE 子句进行部分或全部更新以及高性能附加到varchar(max)/nvarchar(max) 数据类型。

            Here 你可以找到使用.WRITE 子句的完整示例。

            【讨论】:

              【解决方案8】:

              想补充我的转换经验。我在古老的 Linq2SQL 代码中有很多 text 字段。这是为了允许索引中存在的text 列是rebuilt ONLINE

              多年来,我首先知道这些好处,但一直认为转换意味着一些可怕的长查询,SQL Server 必须重建表并复制所有内容,从而使我的网站崩溃并提高我的心率。

              我还担心如果 Linq2SQL 在对列类型进行某种验证时可能会导致错误。

              很高兴地报告,ALTER 命令立即返回 - 所以它们肯定只是更改表元数据。可能会发生一些离线工作以将

              我运行以下命令来查找所有需要转换的列:

              SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
              FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name
              
              SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
              FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name
              

              这给了我一个很好的查询列表,我刚刚选择并复制到一个新窗口。就像我说的 - 运行它是即时的。

              Linq2SQL 非常古老——它使用一个设计器,您可以将表格拖到上面。 EF Code 首先的情况可能更复杂,但我还没有解决这个问题。

              【讨论】:

                猜你喜欢
                • 2010-09-08
                • 1970-01-01
                • 1970-01-01
                • 2022-01-19
                • 1970-01-01
                • 2013-12-12
                • 2017-11-12
                • 1970-01-01
                • 2012-09-23
                相关资源
                最近更新 更多