13.3.4 BLOB 和 TEXT 类型
一个 BLOB 是一个可以存储可变大小数据的二进制大对象。四种 BLOB 类型是 TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB。它们只在可以存储的值长度上有所不同。四种 TEXT 类型是 TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT。它们对应于四种 BLOB 类型,具有相同的最大长度和存储要求。见第13.7节,“数据类型存储要求”。
BLOB 值被视为二进制字符串(字节数组)。它们具有 binary 字符集和排序规则,比较和排序基于列值中的字节的数字值。TEXT 值被视为非二进制字符串(字符数组)。它们具有除 binary 之外的字符集,值根据字符集的排序规则进行排序和比较。
如果不启用严格SQL模式,并将值分配给一个BLOB或TEXT列,那么超过列最大长度的值将被截断,生成警告。对于非空白字符的截断,可以在严格SQL模式下使其发生错误,而不是警告,并且抑制插入该值。请参阅第7.1.11节,“服务器SQL模式”。
无论SQL模式如何,截断要插入到TEXT列的末尾空格总是生成警告。
对于TEXT和BLOB列,在插入时不进行填充,在查询时不删除字节。
如果将TEXT列索引,那么索引条目比较在末尾添加空格。这意味着,如果索引要求唯一值,相同的值只在末尾空格不同就发生重复键错误。例如,如果表包含'a',那么尝试存储'a '将导致重复键错误。这不适用于BLOB列。
在大多数方面,您可以将一个BLOB列视为一个可以任意大小的VARBINARY列,类似地,您也可以将一个TEXT列视为一个可以任意大小的VARCHAR列。BLOB和TEXT与VARBINARY和VARCHAR在以下方面不同:
-
对于
BLOB和TEXT列的索引,您必须指定索引前缀长度。对于CHAR和VARCHAR,索引前缀长度是可选的。请参阅第10.3.5节,“列索引”。
如果您使用BINARY属性与一个TEXT数据类型,列将被分配该列字符集的二进制(_bin)排序规则。
LONG 和 LONG VARCHAR 映射到 MEDIUMTEXT 数据类型。这是一个兼容性特征。
MySQL Connector/ODBC 将 BLOB 值定义为 LONGVARBINARY,将 TEXT 值定义为 LONGVARCHAR。
由于 BLOB 和 TEXT 值可能非常长,因此您可能会遇到使用它们时的一些限制:
-
当排序时,只使用列的前
max_sort_length字节。默认值为 1024。您可以在服务器启动或运行时增加max_sort_length的值,以使更多字节参与排序或分组。任何客户端都可以在会话中更改max_sort_length变量:mysql> SET max_sort_length = 2000; mysql> SELECT id, comment FROM t -> ORDER BY comment; -
查询结果中包含
BLOB或TEXT列的实例,会使服务器使用磁盘表而不是内存表,因为MEMORY存储引擎不支持这些数据类型(见第10.4.4节,“MySQL内部临时表用法”)。使用磁盘会带来性能惩罚,所以只在真的需要时才包含BLOB或TEXT列。例如,避免使用SELECT *,它会选择所有列。 -
BLOB 或 TEXT 对象的最大大小由其类型确定,但客户端和服务器之间实际可以传输的最大值则由可用内存和通信缓冲区的大小决定。您可以通过更改
max_allowed_packet变量来改变消息缓冲区大小,但必须同时在服务器和客户端程序中进行更改。例如,both mysql 和 mysqldump 都可以更改客户端max_allowed_packet值。见第7.1.1节,“配置服务器”、第6.5.1节,“mysql — The MySQL Command-Line Client”、第6.5.4节,“mysqldump — A Database Backup Program”。您也可能想比较包大小和存储对象的大小与存储要求,见第13.7节,“数据类型存储要求”
每个 BLOB 或 TEXT 值都由单独分配的对象表示。这与其他所有数据类型不同,后者在表打开时一次性分配存储空间。
在某些情况下,可能需要将二进制数据,如媒体文件,存储到 BLOB 或 TEXT 列中。你可能会发现 MySQL 的字符串处理函数对此类数据很有用处。见第 14.8 节,“字符串函数和操作符”。出于安全和其他原因,通常情况下更好地使用应用程序代码,而不是将 FILE 权限授予应用用户。你可以在 MySQL 论坛 (http://forums.mysql.com/) 中讨论各种语言和平台的细节。
在 mysql 客户端中,二进制字符串使用十六进制表示,取决于 --binary-as-hex 的值。关于该选项的更多信息,请见第 6.5.1 节,“mysql — MySQL 命令行客户端”。