官方文档地址:11.3.4 The BLOB and TEXT Types
BLOB
是一个二进制大对象,可以保存可变数量的数据。四种BLOB
类型是TINYBLOB
、BLOB
、MEDIUMBLOB
和LONGBLOB
。它们的不同之处在于它们所能保存的值的最大长度。四种TEXT
类型是TINYTEXT
、TEXT
、MEDIUMTEXT
和LONGTEXT
。它们对应于四种BLOB
类型,具有相同的最大长度和存储要求。参见 11.7 数据类型存储要求。
BLOB
值被视为二进制字符串(字节字符串)。它们具有二进制字符集和排序规则,比较和排序基于列值中字节的数值。TEXT
值被视为非二进制字符串(字符字符串)。它们具有非二进制的字符集,并根据字符集的排序规则对值进行排序和比较。
如果没有启用严格 SQL 模式,并且将超过列最大长度的值分配给BLOB
或TEXT
列,该值会被截断以适合列的最大长度,并生成警告。要禁止非空格字符的截断,可以使用严格的 SQL 模式导致出现错误(而不是警告)并禁止插入值。参见 5.1.11 服务器 SQL 模式。
无论使用哪种 SQL 模式,截断要插入到TEXT
列中的值的多余尾随空格总是会生成警告。
对于TEXT
和BLOB
列,插入的时候没有填充,查询时也没有字节剥离。
如果对TEXT
列建立了索引,则索引条目比较的时候将在末尾填充空格。这意味着,如果索引要求唯一的值,那么仅在尾随空格的数量上不同的值就会发生重复键错误。例如,如果一个表包含'a'
,尝试存储'a '
会导致重复键错误。但对于BLOB
列则不是这样。
在大多数情况下,可以将BLOB
列视为任意大小的VARBINARY
列。类似地,您可以将TEXT
列视为VARCHAR
列。BLOB
和TEXT
与VARBINARY
和VARCHAR
在以下方面不同:
- 对于
BLOB
和TEXT
列上的索引,必须指定索引前缀长度。对于CHAR
和VARCHAR
,前缀长度是可选的。参见 8.3.5 列索引。 BLOB
和TEXT
列不能具有默认值。
如果将BINARY
属性与TEXT
数据类型一起使用,则将为列字符集分配二进制(_bin
)排序规则。
LONG
和LONG VARCHAR
映射到MEDIUMTEXT
数据类型。这是一个兼容性特性。
MySQL Connector/ODBC 将BLOB
值定义为LONGVARBINARY
,将TEXT
值定义为LONGVARCHAR
。
因为BLOB
和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
存储引擎不支持这些数据类型(参见 8.4.4 MySQL内部临时表的使用)。使用磁盘会导致性能损失,所以只有在确实需要时才在查询结果中包含BLOB
或TEXT
列。例如,避免使用SELECT *
,它会选择所有列。 BLOB
或TEXT
对象的最大大小由其类型决定,但是实际上可以在客户机和服务器之间传输的最大值是由可用内存的数量和通信缓冲区的大小决定的。您可以通过更改max_allowed_packet
变量的值来更改消息缓冲区的大小,但是必须同时对服务器和客户端程序进行更改。例如,mysql
和mysqldump
都允许更改客户端的max_allowed_packet
的值。参考 5.1.1 配置服务器,4.5.1 mysql - MySQL 命令行客户端,4.5.4 mysqldump - 数据库备份程序。您可能还想将要存储的数据包大小和数据对象的大小与存储需求进行比较,请参见 11.7 数据类型存储需求。
每个BLOB
或TEXT
值在内部由单独分配的对象表示。这与所有其他数据类型不同,其他数据类型是在打开表时,为每个列分配一次存储。
在某些情况下,可能希望将二进制数据(如媒体文件)存储在BLOB
或TEXT
列中。您可能会发现 MySQL 的字符串处理函数对于处理这样的数据很有用。参见 12.8 字符串函数和操作符。出于安全和其他原因,通常最好使用应用程序代码,而不是向应用程序用户授予FILE
特权。你可以在 MySQL 论坛中讨论各种语言和平台的细节。