我正在尝试将一个HTML blob插入到我们的sql-server2005数据库中。我一直使用数据类型的文本作为blob最终所在的字段。我还在域模型中的字段上添加了一个“@Lob”注释。当我试图存储的HTML blob超过65536个字符时,问题就出现了。
在使用@Lob注释时,这似乎是text数据类型的字符限制。理想情况下,我希望保持整个blob的完整性,而不是将其分块到数据库中的多个行中。
请允许我澄清一下注释:
@Lob
@Column(length = Integer. MAX_VALUE) //per an answer on stackoverflow
private String htmlBlob; 数据库端(sql-server-2005):
CREATE TABLE dbo.IndustrySectorTearSheetBlob(
...
htmlBlob text NULL
...
)在65536个字符之后仍然看到截断...
编辑:我已经打印出了所有可能的字符串(现在只有10个)的内容,这些字符串将被插入到数据库中。每个字符串似乎都包含所有字符,从字符串末尾出现的关闭html标记来判断...
发布于 2009-12-08 00:33:57
实际上,我认为您要查找的是一个CLOB字段。引用Using Advanced Data Types
BLOB和CLOB和NCLOB数据类型
JDBC驱动程序实现了java.sql.Blob、java.sql.Clob和java.sql.NClob接口的所有方法。
注意:CLOB值可以与SQL Server2005大值数据类型一起使用。具体而言,nvarchar(max).类型可与(Max)和nvarchar(max)数据类型一起使用,BLOB类型可与varbinary(max)和图像数据类型一起使用,而NCLOB类型可与ntext和nvarchar(Max)数据类型一起使用
换句话说,如果需要unicode支持,请使用VARCHAR(MAX)或NVARCHAR(MAX)。关于它们的最大长度:
VARCHAR(MAX)的最大存储大小为2^31-1字节(2,147,483,647字节或2 2GB 1字节)。存储大小是输入数据的实际长度+2个字节。输入的数据长度可以为0个字符。由于VARCHAR数据类型中的每个字符都使用一个字节,因此VARCHAR(MAX)数据类型的最大长度为2,147,483,645。
NVARCHAR(MAX)的最大存储大小也是2^31-1字节(2,147,483,647字节或2 2GB 1字节)。以字节为单位的存储大小是输入字符数+2字节的两倍。输入的数据长度可以为0个字符。由于NVARCHAR数据类型中的每个Unicode字符使用两个字节,因此NVARCHAR(MAX)数据类型的最大长度为1,073,741,822。
这对于您的HTML来说应该足够了。
编辑:在Hibernate端,带注释的实体看起来很好。在数据库方面,这应该是可以的。但是,您是否可以尝试使用VARCHAR(MAX)而不是TEXT (并消除对文本的疑虑)。
CREATE TABLE dbo.IndustrySectorTearSheetBlob (
...
htmlBlob varchar(max) NULL
...
)顺便问一下,您使用的是哪种Hibernate方言?您使用的是什么JDBC驱动程序?
发布于 2009-12-08 00:09:09
您还可以使用下面的代码来查看注释
@Column(length = Integer.MAX_VALUE)虽然不确定为什么blob是必要的,但NVARCHAR(MAX)将存储您想要的所有html。
发布于 2009-12-08 00:03:06
嗯,我还没有在Sql-Server2005中使用过Hibernate,但是我在MySQL中使用过Oracle TopLink。我在我使用的对象中使用了一个没有任何注释的直接byte[],它工作得很好。
所以,如果我是你,我会试着把你的超文本标记语言存储在一个编码的字节use UTF-8 or whatever中。当您需要以字符串形式访问HTML文本时,只需将其解码即可。
从理论上讲,你的文本不应该被切断,但有时这些东西是不够的。
https://stackoverflow.com/questions/1860850
复制相似问题