我的一位同事正在使用SQL Server 2000,并且出现显示问题,其中使用数据类型ntext
的XML列正在显示<Long Text>
。我猜这是因为字符长度太短(16)
,但它不允许任何更改。
尝试将数据类型更改为varchar
时会出现警告。将数据类型从ntext
更改为varchar/nvarchar
是否会影响表中的数据?
答案 0 :(得分:3)
更改为varchar
可能会丢失Unicode信息,例如
DECLARE @x NVARCHAR(1) = NCHAR(257);
SELECT @x, CONVERT(VARCHAR(1), @x);
结果:
---- ----
ā a
-- these are NOT the same!
更改为nvarchar(<=4000)
可能会丢失所有数据&gt; 8000字节(4000个字符)。如果设计师选择ntext
但从未存储超过4000个字符,这可能没问题,但您应该先检查一下:
SELECT COUNT(*) FROM dbo.table WHERE DATALENGTH(next_column) > 8000;
如果返回0,您可以安全地转换为NVARCHAR(4000)
,但您仍然无法轻松使用SSMS工具修改长文本数据(这不是他们的用途)而您仍可能对您的申请产生影响
您可能拥有对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个字符)。 text
和ntext
数据未存储在数据页面上(因为它不适合单个页面),16个字节是表示指针的字节数这样,当读取页面时,它可以告诉SQL Server在行外的哪个位置找到实际的数据。
真正的答案是停止使用SSMS中的图形工具来查看(尤其是修改!)数据。如果要查看ntext
列的内容,可以选择子字符串,例如
SELECT CONVERT(NVARCHAR(4000), ntext_column) FROM dbo.table;
...或在应用程序中执行此操作。但请勿使用Open Table
或EDIT TOP n ROWS
作为电子表格。
另一个真正的答案是get off of SQL Server 2000 already。在SQL Server的现代版本中,有一种更友好的数据类型称为nvarchar(max)
。