11.3.4 BLOB 和 TEXT 类型
BLOB
是一个二进制大对象,可以容纳可变数量的数据。四种BLOB
类型是TINYBLOB
,BLOB
,MEDIUMBLOB
和LONGBLOB
。这些仅在它们可以容纳的值的最大长度上有所不同。四种TEXT
类型是TINYTEXT
,TEXT
,MEDIUMTEXT
和LONGTEXT
。它们对应四种BLOB
类型,并且具有相同的最大长度和存储要求。参见第 11.7 节“数据类型存储要求”。
BLOB
值被视为二进制字符串(字节字符串)。它们具有binary
字符集和排序规则,并且比较和排序基于列值中字节的数字值。 TEXT
值被视为非二进制字符串(字符字符串)。它们具有binary
以外的字符集,并且根据字符集的排序规则对值进行排序和比较。
如果未启用严格的 SQL 模式,并且您为BLOB
或TEXT
列分配的值超过了该列的最大长度,则该值将被截断以适合并生成警告。对于非空格字符的截断,可以通过使用严格的 SQL 模式导致发生错误(而不是警告)并抑制该值的插入。参见第 5.1.10 节“服务器 SQL 模式”。
不管使用哪种 SQL 模式,从要插入TEXT列中的值截断多余的尾随空格总是会产生警告。
对于TEXT
和BLOB
列,插入时没有填充,选择时也不会删除字节。
如果对TEXT
列构建索引,则索引条目比较将在末尾加空格。这意味着,如果索引要求唯一值,则仅尾随空格数量不同的值将发生重复键错误。例如,如果 table 包含'a'
,则尝试存储'a '
会导致重复键错误。 BLOB
列不是这样。
在大多数方面,您可以将BLOB
列视为VARBINARY列,该列可以随您的喜欢而变大。同样,您可以将TEXT
列视为VARCHAR列。 BLOB
和TEXT
与VARBINARY和VARCHAR在以下方面有所不同:
-
对于
BLOB
和TEXT
列上的索引,必须指定索引前缀长度。对于CHAR和VARCHAR,前缀长度是可选的。参见第 8.3.4 节“列索引”。
如果您将BINARY
属性与TEXT
数据类型一起使用,则会为该列分配列字符集的二进制(_bin
)归类。
LONG
和LONG VARCHAR
Map 到MEDIUMTEXT
数据类型。这是一项兼容性功能。
MySQL Connector/ODBC 将BLOB
值定义为LONGVARBINARY
并将TEXT
值定义为LONGVARCHAR
。
由于BLOB
和TEXT
值可能非常长,因此在使用它们时可能会遇到一些限制:
- 排序时仅使用该列的前max_sort_length个字节。 max_sort_length的默认值为 1024.通过在服务器启动或运行时增加max_sort_length的值,可以使更多字节在排序或分组中有意义。任何 Client 端都可以更改其会话max_sort_length变量的值:
mysql> SET max_sort_length = 2000;
mysql> SELECT id, comment FROM t
-> ORDER BY comment;
-
使用临时 table 处理的查询结果中的
BLOB
或TEXT
列实例导致服务器使用磁盘上的 table 而不是内存中的 table,因为MEMORY
存储引擎不支持这些数据类型(请参见第 8.4.4 节“ MySQL 中的内部临时 table 使用”)。使用磁盘会导致性能下降,因此仅在确实需要时在查询结果中包含BLOB
或TEXT
列。例如,避免使用SELECT *,它会选择所有列。 -
BLOB
或TEXT
对象的最大大小由其类型确定,但实际上可以在 Client 端和服务器之间传输的最大值由可用内存量和通信缓冲区的大小确定。您可以通过更改max_allowed_packet变量的值来更改消息缓冲区的大小,但是必须同时对服务器和 Client 端程序进行更改。例如,使用mysql和mysqldump都可以更改 Client 端max_allowed_packet的值。参见第 5.1.1 节“配置服务器”,第 4.5.1 节“ mysql-MySQL 命令行 Client 端”和第 4.5.4 节“ mysqldump-数据库备份程序”。您可能还需要比较数据包大小和要存储的数据对象的大小与存储要求,请参见第 11.7 节“数据类型存储要求”
每个BLOB
或TEXT
值在内部都由单独分配的对象 table 示。这与所有其他数据类型形成对比,所有其他数据类型在打开 table 时为每列分配一次存储。
在某些情况下,可能希望将二进制数据(例如媒体文件)存储在BLOB
或TEXT
列中。您可能会发现 MySQL 的字符串处理功能对于处理此类数据很有用。参见第 12.7 节“字符串函数和运算符”。出于安全性和其他原因,通常最好使用应用程序代码而不是为应用程序用户授予FILE特权。您可以在 MySQL 论坛(http://forums.mysql.com/)中讨论各种语言和平台的细节。