• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • BLOB 和 TEXT 类型

    BLOB是一个二进制大对象,可以容纳可变数量的数据。这四个BLOB类型TINYBLOBBLOBMEDIUMBLOB,和LONGBLOB。这些仅在它们可以容纳的值的最大长度上有所不同。这四个TEXT类型TINYTEXTTEXTMEDIUMTEXT,和LONGTEXT。这些对应于四种BLOB类型,并且具有相同的最大长度和存储要求。请参见“数据类型存储要求”。

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

    如果未启用严格的SQL模式,并且您为BLOBTEXT列分配的值超过了列的最大长度,则该值将被截断以适合并生成警告。对于非空格字符的截断,可以使用严格的SQL模式导致发生错误(而不是警告)并抑制该值的插入。请参见“服务器SQL模式”。

    TEXT不管SQL模式如何,从要插入列的值截断多余的尾随空格总是会产生警告。

    对于TEXTBLOB列,插入时没有填充,选择时也不会删除字节。

    如果对一TEXT列进行索引,则索引条目比较将在末尾加空格。这意味着,如果索引要求唯一值,则仅尾随空格数量不同的值将发生重复键错误。例如,如果表包含'a',则尝试存储'a '会导致重复键错误。对于BLOB列,情况并非如此。

    在大多数方面,您可以将BLOB列视为VARBINARY可以根据需要任意大的列。同样,您可以将一TEXT列视为一VARCHAR列。BLOB并且TEXT不同于VARBINARYVARCHAR在以下方面:

    • 对于on BLOBTEXTcolumn 上的索引,必须指定索引前缀长度。对于CHARVARCHAR,前缀长度是可选的。请参见“列索引”。
    • BLOB并且TEXT列不能有DEFAULT值。

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

    LONGLONG VARCHAR映射到MEDIUMTEXT数据类型。这是一项兼容性功能。

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

    由于BLOBand TEXT值可能非常长,因此在使用它们时可能会遇到一些限制:

    • max_sort_length校验时仅使用该列的第一个字节。默认值为max_sort_length1024。通过增加max_sort_length服务器启动或运行时的值,可以使更多字节有效地用于校验或分组。任何客户端都可以更改其会话max_sort_length变量的值:

      mysql> SET max_sort_length = 2000;
      mysql> SELECT id, comment FROM t
      -> ORDER BY comment;
      
    • 使用临时表处理的查询结果中的实例BLOBTEXT列会导致服务器在磁盘而不是内存中使用表,因为MEMORY存储引擎不支持这些数据类型(请参见“MySQL中内部临时表的使用”在MySQL中使用表格”)。使用磁盘会导致性能下降,因此仅在确实需要时在查询结果中包含BLOBTEXT列。例如,避免使用SELECT *选择所有列的。
    • BLOBTEXT对象的最大大小由其类型决定,但实际上可以在客户端和服务器之间传输的最大值由可用内存量和通信缓冲区的大小决定。您可以通过更改max_allowed_packet变量的值来更改消息缓冲区的大小,但是必须同时对服务器和客户端程序进行更改。例如,mysqlmysqldump都使您能够更改客户端max_allowed_packet值。请参见“配置服务器”,“mysql-MySQL命令行客户端”和“ mysqldump-数据库备份程序”。您可能还需要将数据包大小和要存储的数据对象的大小与存储要求进行比较,请参见“数据类型存储要求

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

    在某些情况下,可能希望将二进制数据(例如媒体文件)存储在BLOBTEXT列中。您可能会发现MySQL的字符串处理功能对于处理此类数据很有用。请参见“字符串函数和运算符”。出于安全性和其他原因,通常最好使用应用程序代码而不是赋予应用程序用户FILE特权。您可以在MySQL论坛(http://forums.mysql.com/)中讨论各种语言和平台的细节。