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
个字节。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
变量的值来更改消息缓冲区大小,但您必须同时为服务器和客户端程序执行此操作。例如,mysql 和 mysqldump 都允许您更改客户端max_allowed_packet
的值。请参阅第 7.1.1 节“配置服务器”、第 6.5.1 节“mysql — MySQL 命令行客户端” 和 第 6.5.4 节“mysqldump — 数据库备份程序”。您可能还想将数据包大小和您正在存储的数据对象的大小与存储需求进行比较,请参阅第 13.7 节“数据类型存储需求”
每个 BLOB
或 TEXT
值在内部都由一个单独分配的对象表示。这与所有其他数据类型形成对比,对于其他数据类型,在打开表时,每个列分配一次存储空间。
在某些情况下,您可能希望将媒体文件之类的二进制数据存储在 BLOB
或 TEXT
列中。您可能会发现 MySQL 的字符串处理函数对处理此类数据很有用。请参阅第 14.8 节 “字符串函数和运算符”。出于安全性和其他原因,通常最好使用应用程序代码来执行此操作,而不是授予应用程序用户FILE
权限。您可以在 MySQL 论坛 (http://forums.mysql.com/) 中讨论各种语言和平台的具体细节。
在 mysql 客户端中,二进制字符串使用十六进制表示法显示,具体取决于 --binary-as-hex
的值。有关该选项的更多信息,请参阅第 6.5.1 节 “mysql — MySQL 命令行客户端”。