> For the complete documentation index, see [llms.txt](https://bohans.gitbook.io/ji-chu/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bohans.gitbook.io/ji-chu/mysql/sql-you-hua/schema-she-ji/xuan-ze-shu-ju-lei-xing/zi-fu-chuan-lei-xing/blob-he-text.md).

# BLOB 和 TEXT

<mark style="color:blue;">**BLOB**</mark> 和 <mark style="color:blue;">**TEXT**</mark> 都<mark style="color:blue;">**是为存储很大的数据而设计的字符串数据类型**</mark>，分别采用<mark style="color:blue;">**二进制**</mark>和<mark style="color:blue;">**字符**</mark>方式存储。

它们分别属于两组不同的数据类型家族：

* 字符类型是 <mark style="color:blue;">**TINYTEXT**</mark>、<mark style="color:blue;">**SMALLTEXT**</mark>、<mark style="color:blue;">**TEXT**</mark>、<mark style="color:blue;">**MEDIUMTEXT**</mark> 和 <mark style="color:blue;">**LONGTEXT**</mark>；
* 二进制类型是 <mark style="color:blue;">**TINYBLOB**</mark>、<mark style="color:blue;">**SMALLBLOB**</mark>、<mark style="color:blue;">**BLOB**</mark>、<mark style="color:blue;">**MEDIUMBLOB**</mark> 和 <mark style="color:blue;">**LONGBLOB**</mark>。
* BLOB 是 SMALLBLOB 的同义词，TEXT 是 SMALLTEXT 的同义词。

BLOB 和 TEXT 家族之间的唯一区别是：**BLOB 类型存储的是二进制数据，没有排序规则或字符集**，但**TEXT 类型有字符集和排序规则**。

{% hint style="info" %}
与其他数据类型不同，<mark style="color:blue;">**MySQL 把每个 BLOB 和 TEXT 值当作一个具有自己标识的对象来处理**</mark>。存储引擎通常会专门存储它们。

<mark style="color:blue;">**当 BLOB 和 TEXT 值太大时，InnoDB 会使用独立的“外部”存储区域**</mark>，此时每个值在行内需要 1 ～4 字节的存储空间，然后在外部存储区域需要足够的空间来存储实际的值。
{% endhint %}

{% hint style="info" %}
MySQL 对 BLOB 和 TEXT 列的排序与其他类型不同：它**只对这些列的最前&#x20;**<mark style="color:blue;">**max\_sort\_length**</mark>**&#x20;字节而不是整个字符串做排序**。

如果只需要按前面少数几个字符排序，可以减小 **max\_sort\_length** 服务器变量的值。
{% endhint %}

{% hint style="warning" %}
**MySQL 不能将 BLOB 和 TEXT 数据类型的完整字符串放入索引，也不能使用索引进行排序。**
{% endhint %}

{% hint style="success" %}
**在数据库中存储图像**

**在过去，某些应用程序接受上传的图像并将其作为 BLOB 数据存储在 MySQL 数据库中**，这是很常见的。这种方法便于将应用程序的数据保存在一起；但是，**随着数据大小的增长，修改 schema 等操作会由于 BLOB 数据的大小而变得越来越慢**。

<mark style="color:orange;">**如果可以避免的话，不要在数据库中存储像图像这样的数据**</mark>。相反，<mark style="color:orange;">**应该将它们写入单独的对象数据存储，并使用该表来跟踪图像的位置或文件名**</mark>。
{% endhint %}
