11.3.4 BLOB 和 TEXT 类型

官方文档地址:11.3.4 The BLOB and TEXT Types


BLOB是一个二进制大对象,可以保存可变数量的数据。四种BLOB类型是TINYBLOBBLOBMEDIUMBLOBLONGBLOB。它们的不同之处在于它们所能保存的值的最大长度。四种TEXT类型是TINYTEXTTEXTMEDIUMTEXTLONGTEXT。它们对应于四种BLOB类型,具有相同的最大长度和存储要求。参见 11.7 数据类型存储要求

BLOB值被视为二进制字符串(字节字符串)。它们具有二进制字符集和排序规则,比较和排序基于列值中字节的数值。TEXT值被视为非二进制字符串(字符字符串)。它们具有非二进制的字符集,并根据字符集的排序规则对值进行排序和比较。

如果没有启用严格 SQL 模式,并且将超过列最大长度的值分配给BLOBTEXT列,该值会被截断以适合列的最大长度,并生成警告。要禁止非空格字符的截断,可以使用严格的 SQL 模式导致出现错误(而不是警告)并禁止插入值。参见 5.1.11 服务器 SQL 模式

无论使用哪种 SQL 模式,截断要插入到TEXT列中的值的多余尾随空格总是会生成警告。

对于TEXTBLOB列,插入的时候没有填充,查询时也没有字节剥离。

如果对TEXT列建立了索引,则索引条目比较的时候将在末尾填充空格。这意味着,如果索引要求唯一的值,那么仅在尾随空格的数量上不同的值就会发生重复键错误。例如,如果一个表包含'a',尝试存储'a '会导致重复键错误。但对于BLOB列则不是这样。

在大多数情况下,可以将BLOB列视为任意大小的VARBINARY列。类似地,您可以将TEXT列视为VARCHAR列。BLOBTEXTVARBINARYVARCHAR在以下方面不同:

  • 对于BLOBTEXT列上的索引,必须指定索引前缀长度。对于CHARVARCHAR,前缀长度是可选的。参见 8.3.5 列索引
  • BLOBTEXT列不能具有默认值。

如果将BINARY属性与TEXT数据类型一起使用,则将为列字符集分配二进制(_bin)排序规则。

LONGLONG VARCHAR映射到MEDIUMTEXT数据类型。这是一个兼容性特性。

MySQL Connector/ODBC 将BLOB值定义为LONGVARBINARY,将TEXT值定义为LONGVARCHAR

因为BLOBTEXT值可能非常长,在使用它们时可能会遇到一些限制:

  • 排序时只使用列的第一个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;
  • 使用临时表处理的查询结果实例中的BLOBTEXT列,会导致服务器在磁盘上而不是在内存中使用表,因为MEMORY存储引擎不支持这些数据类型(参见 8.4.4 MySQL内部临时表的使用)。使用磁盘会导致性能损失,所以只有在确实需要时才在查询结果中包含BLOBTEXT列。例如,避免使用SELECT *,它会选择所有列。
  • BLOBTEXT对象的最大大小由其类型决定,但是实际上可以在客户机和服务器之间传输的最大值是由可用内存的数量和通信缓冲区的大小决定的。您可以通过更改max_allowed_packet变量的值来更改消息缓冲区的大小,但是必须同时对服务器和客户端程序进行更改。例如,mysqlmysqldump都允许更改客户端的max_allowed_packet的值。参考 5.1.1 配置服务器4.5.1 mysql - MySQL 命令行客户端4.5.4 mysqldump - 数据库备份程序。您可能还想将要存储的数据包大小和数据对象的大小与存储需求进行比较,请参见 11.7 数据类型存储需求

每个BLOBTEXT值在内部由单独分配的对象表示。这与所有其他数据类型不同,其他数据类型是在打开表时,为每个列分配一次存储。

在某些情况下,可能希望将二进制数据(如媒体文件)存储在BLOBTEXT列中。您可能会发现 MySQL 的字符串处理函数对于处理这样的数据很有用。参见 12.8 字符串函数和操作符。出于安全和其他原因,通常最好使用应用程序代码,而不是向应用程序用户授予FILE特权。你可以在 MySQL 论坛中讨论各种语言和平台的细节。

猜你喜欢

转载自blog.csdn.net/wb1046329430/article/details/114783334