在SQL Server中使用nvarchar(max)
与NText
数据类型有哪些优缺点?我不需要向后兼容性,因此在较旧的SQL Server版本中不支持nvarchar(max)
。
修改:显然,该问题也适用于TEXT
和IMAGE
与varchar(max)
和varbinary(max)
,对于那些搜索这些数据的人来说 - 类型以后。
答案 0 :(得分:183)
优点是您可以在LEN
上使用LEFT
和nvarchar(max)
等功能,而不能对ntext
和text
执行此操作。使用nvarchar(max)
比text
使用WRITETEXT
和UPDATETEXT
更容易。
此外,text
,ntext
等已被弃用(http://msdn.microsoft.com/en-us/library/ms187993.aspx)
答案 1 :(得分:36)
VARCHAR(MAX)
足以容纳TEXT
字段。 SQL Server 2000的TEXT
,NTEXT
和IMAGE
数据类型将在SQL Server的未来版本中弃用,SQL Server 2005提供向后兼容的数据类型,但建议使用新数据类型为VARCHAR(MAX)
,NVARCHAR(MAX)
和VARBINARY(MAX)
。
答案 2 :(得分:31)
ntext
将始终将其数据存储在单独的数据库页面中,而nvarchar(max)
将尝试将数据存储在数据库记录本身中。
所以nvarchar(max)
有点快(如果你的文字小于8 kB)。我还注意到数据库大小会稍微增长,这也很好。
转到nvarchar(max)
。
答案 3 :(得分:12)
nvarchar(max)
是你想要使用的。最大的优点是您可以在此数据类型上使用所有T-SQL字符串函数。 ntext
无法做到这一点。我不知道任何真正的缺点。
答案 4 :(得分:4)
Text
(与NText
和Image
一起)的最大缺点是它将在SQL Server的未来版本中删除,如the documentation。这将有效地使您的架构在发布该版本的SQL Server时更难升级。
答案 5 :(得分:4)
你应该显然使用nvarchar(max)
:
<强> MSDN 强>
答案 6 :(得分:1)
答案 7 :(得分:1)
希望增加转换经验。我在古代Linq2SQL代码中有很多text
个字段。这是为了允许索引中的text
列为rebuilt ONLINE。
首先我已经了解了多年的好处,但总是假设转换意味着一些可怕的长查询,其中SQL Server必须重建表并复制所有内容,关闭我的网站并提高我的心率。
我还担心如果对列类型进行某种验证,Linq2SQL可能会导致错误。
很高兴报告,ALTER命令立即返回 - 因此它们肯定只是更改表元数据。可能会发生一些离线工作,将&lt; 8000字符数据带回到表内,但ALTER命令是即时的。
我运行以下命令查找需要转换的所有列:
SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] VARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'TEXT' order by table_name, column_name
SELECT concat('ALTER TABLE dbo.[', table_name, '] ALTER COLUMN [', column_name, '] NVARCHAR(MAX)'), table_name, column_name
FROM information_schema.columns where data_type = 'NTEXT' order by table_name, column_name
这给了我一个很好的查询列表,我刚刚选择并复制到一个新窗口。就像我说的那样 - 立即运行它。
Linq2SQL非常古老 - 它使用了一个将表格拖到上面的设计器。对于EF Code,情况可能会更复杂,但我还没有解决这个问题。