我需要在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:
中
- 类型:TEXT
- DisplaySize一直是1431655765。
醇>无论我的@Column(长度= 5000),此大小都不会改变 annotaton。
在 Method2
中
- 类型:BLOB
- DisplaySize:-1
醇>
问题1:此DisplaySize的来源是什么?在TEXT的情况下这看起来非常大,在byte []字段类型的情况下非常小(-1)。为什么@Column长度似乎没有改变DisplaySize。
问题2:是否可以将HTML数据存储为字符串字段类型(最终为TEXT)而不是byte [](最终作为blob)?
注意:我已阅读BLOB标签的所有问题,并清楚图像/文档需要保存为BLOB和文本,如CLOB / TEXT。但是,考虑到如何在DB for TEXT中分配大的DisplaySize,想再次确认HTML数据。
感谢。
答案 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 的数量。