使用BLOB或TEXT / CLOB在字段中保存HTML数据

时间:2018-01-17 14:09:14

标签: java mysql hibernate jpa blob

我需要在mySQL数据库的一个名为ProjectDescription的字段中存储一个html数据页面,使用Spring& JPA 2.1。我已经阅读了this question以及BLOB标签的所有其他问题,但需要清楚一下为什么字段在我的数据库中以某种方式保存。我使用String和byte []字段类型以下面的方式创建了字段。

Method1 :将数据保存为TEXT(以Base64格式编码后,我使用以下方法将我的html数据保存为String)

@Basic(fetch = FetchType.LAZY) 
@Lob
private String projectDescription = "";

Method2 :使用BLOB将数据保存为二进制文件

@Basic(fetch = FetchType.LAZY)
@Lob
@Column(length=5000)
private byte[]  projectDescription1 =new byte[0];

我的假设: 我假设因为一页html数据不是很大,所以TEXT可以和BLOB一起使用

我测试了两个,字段在mySQL数据库中保存如下

  

方法1:

中      
      
  1. 类型:TEXT
  2.   
  3. DisplaySize一直是1431655765。
  4.         

    无论我的@Column(长度= 5000),此大小都不会改变   annotaton。

         

    Method2

    中      
        
    1. 类型:BLOB
    2.   
    3. DisplaySize:-1
    4.   

问题1:此DisplaySize的来源是什么?在TEXT的情况下这看起来非常大,在byte []字段类型的情况下非常小(-1)。为什么@Column长度似乎没有改变DisplaySize。

问题2:是否可以将HTML数据存储为字符串字段类型(最终为TEXT)而不是byte [](最终作为blob)?

注意:我已阅读BLOB标签的所有问题,并清楚图像/文档需要保存为BLOB和文本,如CLOB / TEXT。但是,考虑到如何在DB for TEXT中分配大的DisplaySize,想再次确认HTML数据。

感谢。

1 个答案:

答案 0 :(得分:5)

如果是整页,为什么要从数据库表中获取额外的提取层?如果它只是页面的一部分,那么我建议TEXT CHARACTER SET utf8mb4。页面中的任何非UTF-8文本都会造成麻烦;也许早点赶上它。

数据库行业正在将UTF-8用于所有文本。

Base64是8/6倍。而它正在做的就是避免使用不应该存在的非UTF-8字符。如果有的话,在客户端压缩它并存储在BLOB中,从而缩小3/1。

在MySQL中,TEXT是64K 字节。你最好使用MEDIUMTEXT,其限制为16MB。我说" bytes"因为,例如,中文需要3个,有时4个字节每个字符,所以只有大约25K个中文文本符合TEXT

" DisplaySize一直是1431655765" - 什么???一个网页的千兆字节;没门!即使这包括图像(它不应该),这是非常不合理的。 编辑:eggyal' s评论2 ^ 32/3可能解释了这个奇数。

在MySQL中,SELECT length(my_text) ...将获得该列中 bytes 的数量。