我刚刚看到MediaWiki对MEDIUMBLOB
使用text.old_text
。查看文档,MEDIUMBLOB
和MEDIUMTEXT
看起来几乎完全相同:
BLOB列,最大长度为16,777,215(2 ^ 24-1)个字节。每个MEDIUMBLOB值都使用一个三字节长的前缀存储,该前缀指示该值中的字节数。
和
一个TEXT列,最大长度为16,777,215(2 ^ 24-1)个字符。如果该值包含多字节字符,则有效最大长度会更少。每个MEDIUMTEXT值都使用三字节长度的前缀存储,该前缀指示值中的字节数。
我的猜测是BLOB列在排序方面的行为不同,但除此之外它们的行为完全相同。
所以问题是:为什么MediaWiki然后使用BLOB而不是文本?是否还有其他区别,例如进行备份?
答案 0 :(得分:1)
BLOB
列(小,中,长)包含提供的字节。
TEXT
列也可以这样做,但是它具有CHARACTER SET
,因此它可以在INSERT
期间转换和/或检查字符的有效性。
如果客户端中的编码与表中列的声明不同,则将转换编码。参见SET NAMES
。典型的编码为latin1
和utf8mb4
。
在读取(SELECT
之后,执行反向转码。
但是,如果客户端有latin1字节,并且连接错误地声称客户端已编码为utf8mb4(UTF-8),那么就会发生以下几种不良情况:Mojibake(乱码),截断,问号等
我怀疑old_text
被声明为MEDIUMBLOB
,以避免出现字符集问题。缺点是不知道如何显示old_text。
排序和比较(例如与=
)也有所不同。 BLOB
只是查看这些位。根据所选择的TEXT
,COLLATION
可以进行大小写折叠,特定于区域的等效操作。