我的一位同事正在使用 SQL Server 2000,并且在显示使用数据类型的 XML 列时遇到了显示ntext
问题<Long Text>
。我猜那是因为字符长度太短(16)
,但它不允许任何更改。
尝试将数据类型更改varchar
为警告时出现。从改变数据类型ntext
会varchar/nvarchar
影响表中的数据吗?
我的一位同事正在使用 SQL Server 2000,并且在显示使用数据类型的 XML 列时遇到了显示ntext
问题<Long Text>
。我猜那是因为字符长度太短(16)
,但它不允许任何更改。
尝试将数据类型更改varchar
为警告时出现。从改变数据类型ntext
会varchar/nvarchar
影响表中的数据吗?
更改为varchar
可能会丢失 Unicode 信息,例如
DECLARE @x NVARCHAR(1) = NCHAR(257);
SELECT @x, CONVERT(VARCHAR(1), @x);
结果:
---- ----
ā a
-- these are NOT the same!
更改为nvarchar(<=4000)
可能会丢失任何大于 8000 字节(4000 个字符)的数据。ntext
如果设计师选择但从未存储超过 4000 个字符,这可能没问题,但您应该先检查一下:
SELECT COUNT(*) FROM dbo.table WHERE DATALENGTH(next_column) > 8000;
如果返回 0,您可能可以安全地转换为NVARCHAR(4000)
,但您仍然无法轻松地使用 SSMS 工具修改长文本数据(这不是它们的用途),并且您仍然可能会对您的应用程序产生影响
您可能拥有对ntext
列进行特殊处理的应用程序或存储过程,例如它们可能依赖于READTEXT
、WRITETEXT
和UPDATETEXT
等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 在哪里,off-row,去查找实际数据。
真正的答案是停止使用 SSMS 中的图形工具来查看(尤其是修改!)数据。如果要查看ntext
列的内容,可以选择一个子字符串,例如
SELECT CONVERT(NVARCHAR(4000), ntext_column) FROM dbo.table;
...或在应用程序中执行此操作。但不要使用Open Table
或EDIT TOP n ROWS
作为电子表格。
另一个真正的答案是已经离开 SQL Server 2000。在现代版本的 SQL Server 中有一种更友好的数据类型,称为nvarchar(max)
.