Dav*_*fer 178 sql-server text nvarchar sql-server-2005 sql-server-2008
在SQL Server 中使用nvarchar(max)vs. NText数据类型有哪些优缺点?我不需要向后兼容性,因此nvarchar(max)在较旧的SQL Server版本中不支持它.
编辑:很显然的问题也适用于TEXT和IMAGE对比varchar(max),并varbinary(max)为那些寻找那些数据类型之后.
SQL*_*ace 190
其优点是可以使用的功能,如LEN与LEFT上nvarchar(max),你不能这样做,对ntext和text.它nvarchar(max)比text你必须使用WRITETEXT和使用更容易UPDATETEXT.
此外,text,ntext等等,都被弃用(http://msdn.microsoft.com/en-us/library/ms187993.aspx)
gar*_*kal 37
VARCHAR(MAX)足以容纳TEXT田地.TEXT,NTEXT和IMAGESQL Server 2000中的数据类型将在以后的SQL Server版本,SQL Server 2005提供了向下兼容的数据类型被弃用,但建议要使用的是新的数据类型VARCHAR(MAX),NVARCHAR(MAX)以及VARBINARY(MAX).
GvS*_*GvS 32
ntext将始终将其数据存储在单独的数据库页面中,同时nvarchar(max)尝试将数据存储在数据库记录本身中.
所以nvarchar(max)有点快(如果你的文字小于8 kB).我也注意到数据库大小会稍微增长,这也很好.
去nvarchar(max).
Ran*_*der 12
nvarchar(max)是你想要使用的.最大的优点是您可以在此数据类型上使用所有T-SQL字符串函数.这是不可能的ntext.我不知道任何真正的缺点.
想添加我的转换经验。我text在古老的 Linq2SQL 代码中有很多字段。这是为了允许在线重建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
Run Code Online (Sandbox Code Playgroud)
这给了我一个很好的查询列表,我刚刚选择并复制到一个新窗口。就像我说的 - 运行它是即时的。
Linq2SQL 非常古老——它使用一个设计器,你可以将表拖到上面。首先,EF Code 的情况可能更复杂,但我还没有解决这个问题。