11.3.4 BLOB 和 TEXT 类型

BLOB是一个二进制大对象,可以容纳可变数量的数据。四种BLOB类型是TINYBLOBBLOBMEDIUMBLOBLONGBLOB。这些仅在它们可以容纳的值的最大长度上有所不同。四种TEXT类型是TINYTEXTTEXTMEDIUMTEXTLONGTEXT。它们对应四种BLOB类型,并且具有相同的最大长度和存储要求。参见第 11.7 节“数据类型存储要求”

BLOB值被视为二进制字符串(字节字符串)。它们具有binary字符集和排序规则,并且比较和排序基于列值中字节的数字值。 TEXT值被视为非二进制字符串(字符字符串)。它们具有binary以外的字符集,并且根据字符集的排序规则对值进行排序和比较。

如果未启用严格的 SQL 模式,并且您为BLOBTEXT列分配的值超过了该列的最大长度,则该值将被截断以适合并生成警告。对于非空格字符的截断,可以通过使用严格的 SQL 模式导致发生错误(而不是警告)并抑制该值的插入。参见第 5.1.10 节“服务器 SQL 模式”

不管使用哪种 SQL 模式,从要插入TEXT列中的值截断多余的尾随空格总是会产生警告。

对于TEXTBLOB列,插入时没有填充,选择时也不会删除字节。

如果对TEXT列构建索引,则索引条目比较将在末尾加空格。这意味着,如果索引要求唯一值,则仅尾随空格数量不同的值将发生重复键错误。例如,如果 table 包含'a',则尝试存储'a '会导致重复键错误。 BLOB列不是这样。

在大多数方面,您可以将BLOB列视为VARBINARY列,该列可以随您的喜欢而变大。同样,您可以将TEXT列视为VARCHAR列。 BLOBTEXTVARBINARYVARCHAR在以下方面有所不同:

  • 对于BLOBTEXT列上的索引,必须指定索引前缀长度。对于CHARVARCHAR,前缀长度是可选的。参见第 8.3.4 节“列索引”

  • BLOBTEXT列不能具有DEFAULT值。

如果您将BINARY属性与TEXT数据类型一起使用,则会为该列分配列字符集的二进制(_bin)归类。

LONGLONG VARCHARMap 到MEDIUMTEXT数据类型。这是一项兼容性功能。

MySQL Connector/ODBC 将BLOB值定义为LONGVARBINARY并将TEXT值定义为LONGVARCHAR

由于BLOBTEXT值可能非常长,因此在使用它们时可能会遇到一些限制:

mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM t
    -> ORDER BY comment;

每个BLOBTEXT值在内部都由单独分配的对象 table 示。这与所有其他数据类型形成对比,所有其他数据类型在打开 table 时为每列分配一次存储。

在某些情况下,可能希望将二进制数据(例如媒体文件)存储在BLOBTEXT列中。您可能会发现 MySQL 的字符串处理功能对于处理此类数据很有用。参见第 12.7 节“字符串函数和运算符”。出于安全性和其他原因,通常最好使用应用程序代码而不是为应用程序用户授予FILE特权。您可以在 MySQL 论坛(http://forums.mysql.com/)中讨论各种语言和平台的细节。