一个 BLOB
是一个可以持有可变数量数据的二进制大对象。四种 BLOB
类型是 TINYBLOB
、BLOB
、MEDIUMBLOB
和 LONGBLOB
。这些类型仅在它们可以持有的最大长度值上有所不同。四种 TEXT
类型是 TINYTEXT
、TEXT
、MEDIUMTEXT
和 LONGTEXT
。这些类型对应于四种 BLOB
类型,并且具有相同的最大长度和存储要求。见 第 13.7 节,“数据类型存储要求”。
BLOB
值被视为二进制字符串(字节字符串)。它们具有 binary
字符集和排序规则,并且比较和排序基于列值中的字节值。TEXT
值被视为非二进制字符串(字符字符串)。它们具有除 binary
之外的字符集,并且值的比较和排序基于字符集的排序规则。
如果严格的 SQL 模式未启用,并且您将一个值分配给 BLOB
或 TEXT
列,该值超过列的最大长度,则该值将被截断以适应,并生成警告。如果您想要在严格的 SQL 模式下发生错误(而不是警告)并且抑制值的插入,可以使用严格的 SQL 模式。见 第 7.1.11 节,“服务器 SQL 模式”。
从要插入到 TEXT
列中的值中删除多余的尾随空格总是生成警告,无论 SQL 模式如何。
对于 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 命令行客户端”。