[英]nvarchar(max) vs NText
在SQL Server中使用nvarchar(max)
与NText
数据类型有什么优缺点? 我不需要向后兼容性,因此在较旧的SQL Server版本中不支持nvarchar(max)
。
编辑:显然,对于那些稍后搜索这些数据类型的人来说,问题也适用于TEXT
和IMAGE
与varchar(max)
和varbinary(max)
。
优点是您可以在nvarchar(max)
上使用LEN
和LEFT
等函数,而不能对ntext
和text
。 使用nvarchar(max)
比使用WRITETEXT
和UPDATETEXT
text
更容易。
此外, text
, ntext
等也被弃用( http://msdn.microsoft.com/en-us/library/ms187993.aspx )
VARCHAR(MAX)
足以容纳TEXT
字段。 SQL Server 2000的TEXT
, NTEXT
和IMAGE
数据类型将在SQL Server的未来版本中弃用,SQL Server 2005提供向后兼容数据类型,但建议使用VARCHAR(MAX)
, NVARCHAR(MAX)
新数据类型和VARBINARY(MAX)
。
ntext
将始终将其数据存储在单独的数据库页中,而nvarchar(max)
将尝试将数据存储在数据库记录本身中。
所以nvarchar(max)
有点快(如果你的文本小于8 kB)。 我也注意到数据库大小会稍微增长,这也很好。
去nvarchar(max)
。
nvarchar(max)
是你想要使用的。 最大的优点是您可以在此数据类型上使用所有T-SQL字符串函数。 使用ntext
无法做到这一点。 我不知道任何真正的缺点。
Text
(与NText
和Image
一起)的最大缺点是它将在未来版本的SQL Server中删除,如文档所示 。 这将有效地使您的架构在发布该版本的SQL Server时更难升级。
你应该显然使用nvarchar(max)
:
希望增加转换经验。 我在古代Linq2SQL代码中有很多text
字段。 这是为了允许索引中存在的text
列在线重建 。
首先,我已经知道多年来的好处,但总是假设转换意味着一些可怕的长查询,其中SQL Server必须重建表并复制一切,关闭我的网站并提高我的心率。
我还担心如果对列类型进行某种验证,Linq2SQL可能会导致错误。
很高兴报告,ALTER命令立即返回 - 因此它们肯定只是更改表元数据。 可能会发生一些离线工作,将<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的情况可能更复杂,但我还没有解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.