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