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 命令行客户端”。