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

8
I需要使用Spring和JPA 2.1在MySQL数据库中将一个html数据页面存储到名为ProjectDescription的字段中。我已经阅读了 this question 和所有其他带有BLOB标签的问题,但需要对为什么在我的数据库中以某种方式保存字段的清晰度有所了解。我已经使用String和byte[]字段类型创建了以下方式的字段。 Method1:将数据保存为TEXT(在Base64格式编码之后,我使用下面的方法将我的HTML数据保存为String)
@Basic(fetch = FetchType.LAZY) 
@Lob
private String projectDescription = "";

方法2:使用BLOB将数据保存为二进制

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

我的假设是: 我认为由于HTML数据页面不是很大,所以相对于BLOB,TEXT是可以的。

我测试了两种方法,它们在MySQL数据库中保存的字段如下:

方法1中:

  1. 类型:TEXT
  2. DisplaySize恒定为1431655765。

无论我使用@Column(length=5000)注释,这个大小都不会改变。

方法2中:

  1. 类型:BLOB
  2. DisplaySize:-1

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

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

注意:我已经阅读了所有带有BLOB标签的问题,并清楚地知道图片/文档需要保存为BLOB,而文本则需要保存为CLOB/TEXT。但是,考虑到在数据库中为TEXT分配了多大的DisplaySize,我想再次确认HTML数据的情况。谢谢。

1
你在哪里看到这些 DisplaySize 值的?虽然 MySQL 数字类型可以有“显示宽度”属性,但字符串类型要么具有显式的或隐式的“最大长度”,但这通常不会被称为 DisplaySize。此外,1431655765 的值(即 0x55555555)非常奇怪... 它等于 2^32/3,因此表示可以存储在 LONGTEXT 列中的最大数量的 3 字节字符... 不确定对任何人有什么用处。 - eggyal
在使用MySQL Workbench时,我看到了fieldTypes中的DisplaySize。是的,这似乎确实很奇怪。 - HopeKing
MySql WorkBench有很多bug,建议使用其他客户端进行检查,例如hidesql、sqlyog、phpmyadmin等。因为在WorkBench中,blob的-1看起来像是溢出,并且发布创建表语句,因为它们可以提供更多信息。关于显示大小,请参考https://dba.stackexchange.com/a/370。我仍然... - ronchi82
除非你正在压缩数据,否则请将文本保存为文本,以保留关键的编码信息。 - ronchi82
1个回答

5
如果是整个页面,为什么要通过额外的数据库表获取?如果只是页面的一部分,那么我建议使用TEXT CHARACTER SET utf8mb4。页面中的任何非UTF-8文本都会导致问题;最好尽早发现。
数据库行业正在趋于使用UTF-8处理所有文本。
Base64是8/6倍大小。它所做的只是避免与不应存在的非UTF-8字符产生麻烦。如果可以的话,在客户端压缩并存储到BLOB中,从而缩小3/1。
在MySQL中,TEXT是64K字节。你可能会更喜欢MEDIUMTEXT,它有16MB的限制。我之所以说“字节”是因为,例如,中文需要3个,有时需要4个字节才能表示一个字符,因此只有大约25K个中文字符适合在TEXT中。
“DisplaySize恒定为1431655765”——什么?一个网页需要1GB;不可能!即使包括图像(也不应该),这也是相当不合理的。编辑:eggyal对2^32/3的评论可能解释了这个奇怪的数字。 在MySQL中,SELECT length(my_text) ...将获得该列中的字节数。

我现在明白UTF-8不接受欧洲字符。那么在这种情况下,Base64编码是唯一的出路,对吧?此外,为什么Base64编码会变大6/8倍? - HopeKing
@HopeKing - 什么?UTF-8可以处理所有欧洲字符和全球所有已建立语言的所有字符。带重音的欧洲字母无法适应_Ascii_,因为它只有7位。Base64会搅动_bits_以获取任何8位字节并在ascii中显示它们。但是,您甚至无法阅读普通英语。 - Rick James

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接