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