blob.md 5.6 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
### 11.3.4 BLOB 和 TEXT 类型

[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

一种`斑点`是一个二进制大对象,可以容纳可变数量的数据。四个`斑点`类型是`小斑点`,`斑点`,`中块`, 和`长块`.这些仅在它们可以保存的值的最大长度上有所不同。四个`文本`类型是`小文本`,`文本`,`中文本`, 和`长文`.这四个对应`斑点`类型并具有相同的最大长度和存储要求。看[第 11.7 节,“数据类型存储要求”](storage-requirements.html).

`斑点`值被视为二进制字符串(字节字符串)。他们有`二进制`字符集和排序,比较和排序基于列值中字节的数值。`文本`值被视为非二进制字符串(字符串)。他们有一个字符集`二进制`, 并根据字符集的排序规则对值进行排序和比较。

如果未启用严格 SQL 模式并且您将值分配给`斑点`要么`文本`超过列的最大长度的列,该值将被截断以适应并生成警告。对于非空格字符的截断,您可能会导致发生错误(而不是警告)并使用严格的 SQL 模式禁止插入值。看[第 5.1.11 节,“服务器 SQL 模式”](sql-mode.html).

从要插入的值中截断多余的尾随空格[`文本`](blob.html)无论 SQL 模式如何,列都会生成警告。

为了`文本``斑点`列,插入时没有填充,选择时没有字节被剥离。

如果一个`文本`列被索引,索引条目比较在最后用空格填充。这意味着,如果索引需要唯一值,则仅在尾随空格数不同的值会出现重复键错误。例如,如果一个表包含`'一种'`, 尝试存储`'一种 '`导致重复键错误。这不是真的`斑点`列。

在大多数方面,您可以将`斑点`列作为[`变量`](binary-varbinary.html)可以任意大的列。同样,你可以认为一个`文本`列作为[`VARCHAR`](char.html)柱子。`斑点``文本`与......不同[`变量`](binary-varbinary.html)[`VARCHAR`](char.html)通过以下方式:

-   对于索引`斑点``文本`列,您必须指定索引前缀长度。为了[`字符`](char.html)[`VARCHAR`](char.html),前缀长度是可选的。看[第 8.3.5 节,“列索引”](column-indexes.html).

-   [](<>) [](<>) [](<>) `斑点``文本`列不能有`默认`价值观。

    如果您使用`二进制`带有 a 的属性`文本`数据类型,为该列分配二进制 (`_bin`) 列字符集的排序规则。

`长``长 VARCHAR`映射到`中文本`数据类型。这是一个兼容性功能。

MySQL 连接器/ODBC 定义`斑点`价值观`朗瓦尔二进制``文本`价值观`朗瓦查尔`.

因为`斑点``文本`值可能非常长,在使用时可能会遇到一些限制:

-   只有第一个[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)排序时使用列的字节。的默认值[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)是1024。通过增加[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)在服务器启动或运行时。任何客户端都可以更改其会话的值[`最大排序长度`](server-system-variables.html#sysvar_max_sort_length)变量:

    ```
    mysql> SET max_sort_length = 2000;
    mysql> SELECT id, comment FROM t
        -> ORDER BY comment;
    ```

-   实例`斑点``文本`使用临时表处理的查询结果中的列会导致服务器使用磁盘上的表而不是内存中的表,因为`记忆`存储引擎不支持这些数据类型(请参阅[第 8.4.4 节,“MySQL 中的内部临时表使用”](internal-temporary-tables.html))。使用磁盘会导致性能损失,因此包括`斑点`要么`文本`查询结果中的列仅当它们确实需要时。例如,避免使用[`选择 *`](select.html),它选择所有列。

-   最大尺寸`斑点`要么`文本`对象由它的类型决定,但你实际可以在客户端和服务器之间传输的最大值取决于可用内存量和通信缓冲区的大小。您可以通过更改的值来更改消息缓冲区大小[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)变量,但您必须对服务器和客户端程序都这样做。例如,两者[**mysql**](mysql.html)[**mysql转储**](mysqldump.html)使您能够更改客户端[`max_allowed_pa​​cket`](server-system-variables.html#sysvar_max_allowed_packet)价值。看[第 5.1.1 节,“配置服务器”](server-configuration.html),[第 4.5.1 节,“mysql - MySQL 命令行客户端”](mysql.html), 和[第 4.5.4 节,“mysqldump - 数据库备份程序”](mysqldump.html).您可能还想将数据包大小和您存储的数据对象的大小与存储要求进行比较,请参阅[第 11.7 节,“数据类型存储要求”](storage-requirements.html)

    每个`斑点`要么`文本`value 在内部由单独分配的对象表示。这与所有其他数据类型形成对比,所有其他数据类型在打开表时每列分配一次存储。

    在某些情况下,可能需要将二进制数据(例如媒体文件)存储在`斑点`要么`文本`列。您可能会发现 MySQL 的字符串处理函数对处理此类数据很有用。看[第 12.8 节,“字符串函数和运算符”](string-functions.html).出于安全和其他原因,通常最好使用应用程序代码而不是为应用程序用户提供[`文件`](privileges-provided.html#priv_file)特权。您可以在 MySQL 论坛 (<http://forums.mysql.com/>)。

笔记

[**mysql**](mysql.html)客户端,二进制字符串使用十六进制表示法显示,具体取决于[`--binary-as-hex`](mysql-command-options.html#option_mysql_binary-as-hex).有关该选项的更多信息,请参阅[第 4.5.1 节,“mysql - MySQL 命令行客户端”](mysql.html).