今天在做一个项目时,程序成功向数据库插入一条数据,
插入的是一篇比较大的文章,而且还有很多样式。
Id是int型,Content用的是 ntext类型的
但是当我在手动改数据库Id时出现错误:
错误源:.NET.SqlClient Data Provider
错误信息:将截断字符串或二进制数据。
DBCC执行完毕。如果DBCC输出了错误信息,请与管理员联系。
语句已终止。
出现这个问题的直觉就是插入的数据超过了字段的实际长度。
于是打开数据库修改,发现没有超过的啊?
ntext在我的印象中应该算是最大的了。这样都不行吗?
我又把content数据类型换成nvarchar(MAX),手动更改的时候成功了。
在网上搜索的时候发现nvarchar(MAX) 、ntext是有差别的:
以下转载:http://www.cnblogs.com/dudu/archive/2009/10/17/1585152.html
NTEXT:
默认情况下,NTEXT将文本数据存储在LOB结构中, 在表结构中只存储指针,指针指向该数据在LOB中的存储位置。
NVARCHAR(MAX)
默认情况下,不超过8,000字节的数据直接存储在表结构中,超过的才和NTEXT一样将数据存储在LOB结构中。
NTEXT向NVARCHAR(MAX)的转换:
ALTER TABLE 表名 ALTER COLUMN 字段名 NVARCHAR(MAX) null
执行上面的SQL语句之后,虽然完成了转换,但数据的存储结构并没有改变,还是按照NTEXT的默认存储方式存储在LOB中。
如何实现转换后数据按NVARCHAR(MAX)的方式进行存储呢?只需执行下面的语句:
UPDATE 表名 SET 字段名 = 字段名
比如:表名是Comment,字段名是Content,SQL语句就是: UPDATE Comment SET Content = Content
实测数据:100条数据,耗时706秒。
NTEXT将在以后版本的SQL SERVER中不被支持,微软的文档中建议用NVARCHAR(MAX)取代NTEXT。
ntext, text, and image data types will be removed in a future version of Microsoft SQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead.意思就是:
Microsoft SQL Server 的未来版本中,将删除 ntext、 文本和 image 数据类型。 请避免在新的开发工作中使用这些数据类型,并计划修改当前使用它们的应用程序。 使用 nvarchar (max)、 varchar (max) 和 varbinary (max) 来代替。