首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java/Hibernate/sql-server 2005中的Blob

Java/Hibernate/sql-server 2005中的Blob
EN

Stack Overflow用户
提问于 2009-12-07 23:51:56
回答 3查看 8.8K关注 0票数 0

我正在尝试将一个HTML blob插入到我们的sql-server2005数据库中。我一直使用数据类型的文本作为blob最终所在的字段。我还在域模型中的字段上添加了一个“@Lob”注释。当我试图存储的HTML blob超过65536个字符时,问题就出现了。

在使用@Lob注释时,这似乎是text数据类型的字符限制。理想情况下,我希望保持整个blob的完整性,而不是将其分块到数据库中的多个行中。

请允许我澄清一下注释:

代码语言:javascript
复制
 @Lob   
 @Column(length = Integer. MAX_VALUE) //per an answer on stackoverflow  
 private String htmlBlob;  

数据库端(sql-server-2005):

代码语言:javascript
复制
CREATE TABLE dbo.IndustrySectorTearSheetBlob(  
   ...  
      htmlBlob text NULL    
...
)

在65536个字符之后仍然看到截断...

编辑:我已经打印出了所有可能的字符串(现在只有10个)的内容,这些字符串将被插入到数据库中。每个字符串似乎都包含所有字符,从字符串末尾出现的关闭html标记来判断...

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-08 00:33:57

实际上,我认为您要查找的是一个CLOB字段。引用Using Advanced Data Types

BLOB和CLOB和NCLOB数据类型

JDBC驱动程序实现了java.sql.Blobjava.sql.Clobjava.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 (并消除对文本的疑虑)。

代码语言:javascript
复制
CREATE TABLE dbo.IndustrySectorTearSheetBlob (
...
htmlBlob varchar(max) NULL
... 
)

顺便问一下,您使用的是哪种Hibernate方言?您使用的是什么JDBC驱动程序?

票数 1
EN

Stack Overflow用户

发布于 2009-12-08 00:09:09

您还可以使用下面的代码来查看注释

代码语言:javascript
复制
@Column(length = Integer.MAX_VALUE)

虽然不确定为什么blob是必要的,但NVARCHAR(MAX)将存储您想要的所有html。

票数 4
EN

Stack Overflow用户

发布于 2009-12-08 00:03:06

嗯,我还没有在Sql-Server2005中使用过Hibernate,但是我在MySQL中使用过Oracle TopLink。我在我使用的对象中使用了一个没有任何注释的直接byte[],它工作得很好。

所以,如果我是你,我会试着把你的超文本标记语言存储在一个编码的字节use UTF-8 or whatever中。当您需要以字符串形式访问HTML文本时,只需将其解码即可。

从理论上讲,你的文本不应该被切断,但有时这些东西是不够的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1860850

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档