0

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

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

4

1 回答 1

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)可能会丢失任何大于 8000 字节(4000 个字符)的数据。ntext如果设计师选择但从未存储超过 4000 个字符,这可能没问题,但您应该先检查一下:

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

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

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

    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 个字符)。text并且ntext数据不存储在数据页上(因为它不适合单个页面),并且 16 个字节是表示指针的字节数,因此,当读取页面时,它可以告诉 SQL Server 在哪里,off-row,去查找实际数据。

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

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

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

另一个真正的答案是已经离开 SQL Server 2000。在现代版本的 SQL Server 中有一种更友好的数据类型,称为nvarchar(max).

于 2013-01-29T20:14:04.827 回答