更改NTEXT数据类型以适应更多数据

时间:2013-01-29 20:04:36

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

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

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

1 个答案:

答案 0 :(得分:3)

  1. 更改为varchar可能会丢失Unicode信息,例如

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

    结果:

    ----  ----
    ā     a
    -- these are NOT the same!
    
  2. 更改为nvarchar(<=4000)可能会丢失所有数据&gt; 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%';
    

    有可能出现误报,因此“启动的方式”。


  4. 但如果我在你的鞋子里我不会改变类型

    此外,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)