【问题标题】:Change NTEXT Data Type to Fit More Data更改 NTEXT 数据类型以适应更多数据
【发布时间】:2013-01-29 20:04:36
【问题描述】:

我的一位同事正在使用 SQL Server 2000,并且遇到了显示问题,其中使用数据类型 ntext 的 XML 列显示 <Long Text>。我猜这是因为字符长度太短(16),但它不允许任何更改。

当尝试将数据类型更改为varchar 时,会出现警告。将数据类型从ntext更改为varchar/nvarchar会影响表中的数据吗?

【问题讨论】:

  • 与其继续受苦...请,尝试升级。您比当前版本落后 3-4 个版本(取决于您是否将 8R2 视为单独的版本)。花时间迁移到新版本,而不是试图应对当前版本。
  • 在 ntext 字段中,该字段的性质是什么,举一个示例值???.....让我们用它加星标;)
  • 我完全同意!这是一个同事,而不是我,正在使用 2000。我不知道为什么大多数人至少在 2008 年他们还没有升级......
  • 列名:XML 日期类型:ntext 长度:16 表格在字段中显示

标签: sql-server sql-server-2000 alter-table sqldatatypes


【解决方案1】:
  1. 更改为 varchar 可能会丢失 Unicode 信息,例如

    DECLARE @x NVARCHAR(1) = NCHAR(257);
    
    SELECT @x, CONVERT(VARCHAR(1), @x);
    

    结果:

    ----  ----
    ā     a
    -- these are NOT the same!
    
  2. 更改为nvarchar(<=4000) 可能会丢失任何> 8000 字节(4000 个字符)的数据。如果设计人员选择了ntext 但从未存储超过 4000 个字符,这可能没问题,但您应该先检查一下:

    SELECT COUNT(*) FROM dbo.table WHERE DATALENGTH(next_column) > 8000;
    

    如果返回 0,您可能可以安全地转换为 NVARCHAR(4000),但您仍然无法轻松地使用 SSMS 工具修改长文本数据(这不是它们的用途),您仍然可以对您的应用程序有影响

  3. 您可能拥有对ntext 列进行特殊处理的应用程序或存储过程,例如它们可能依赖于READTEXT, WRITETEXT, UPDATETEXT and TEXTPTR 之类的函数。您需要在代码库中搜索这些命令(这​​是开始查看可能包含这些命令的存储过程的一种方法):

    SELECT o.name
      FROM sysobjects AS o
      INNER JOIN syscomments AS c
      ON o.id = c.id
      WHERE c.[text] LIKE '%READTEXT%'
         OR c.[text] LIKE '%WRITETEXT%'
         OR c.[text] LIKE '%UPDATETEXT%'
         OR c.[text] LIKE '%TEXTPTR%';
    

    存在误报的可能性,因此是“开始的一种方法”。


但如果我站在你的立场上我不会只是改变类型

另外,16 不是字符长度(我可以向您保证,您可以在该列中容纳超过 16 个字符)。 textntext 数据不存储在数据页上(因为它不适合单个页),16 个字节是表示 指针 的字节数,因此,当页面被读取时,它可以告诉 SQL Server 去哪里找到实际的数据。

真正的答案是停止使用 SSMS 中的图形工具来查看(尤其是修改!)数据。如果要查看ntext 列的内容,可以选择一个子字符串,例如

SELECT CONVERT(NVARCHAR(4000), ntext_column) FROM dbo.table;

...或在应用程序中执行此操作。但不要将Open TableEDIT TOP n ROWS 用作电子表格。

另一个真正的答案是get off of SQL Server 2000 already。在 SQL Server 的现代版本中,有一种更友好的数据类型,称为 nvarchar(max)

【讨论】:

  • 非常感谢您的建议!感谢您对此提供的帮助。
猜你喜欢
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多