### 11.3.3 BINARY 和 VARBINARY 类型

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

这`二进制`和`变量`类型类似于[`字符`](char.html)和[`VARCHAR`](char.html)，除了它们存储二进制字符串而不是非二进制字符串。也就是说，它们存储字节字符串而不是字符串。这意味着他们拥有`二进制`字符集和排序规则，以及比较和排序基于值中字节的数值。

允许的最大长度是相同的`二进制`和`变量`因为它是为了[`字符`](char.html)和[`VARCHAR`](char.html)，除了长度为`二进制`和`变量`以字节而不是字符来衡量。

这`二进制`和`变量`数据类型不同于`字符二进制`和`VARCHAR 二进制`数据类型。对于后一种类型，`二进制`属性不会导致该列被视为二进制字符串列。相反，它会导致二进制文件 (`_bin`) 要使用的列字符集（或表默认字符集，如果未指定列字符集）的排序规则，并且列本身存储非二进制字符串而不是二进制字节字符串。例如，如果默认字符集是`utf8mb4`,`CHAR(5) 二进制`被视为`CHAR(5) 字符集 utf8mb4 整理 utf8mb4_bin`.这不同于`二进制（5）`，它存储 5 字节的二进制字符串，其中`二进制`字符集和排序规则。有关两者之间差异的信息`二进制`整理的`二进制`字符集和`_bin`非二进制字符集的排序规则，请参见[第 10.8.5 节，“与\_分类整理”](charset-binary-collations.html).

如果未启用严格 SQL 模式并且您将值分配给`二进制`要么`变量`超过列的最大长度的列，该值将被截断以适应并生成警告。对于截断的情况，要导致发生错误（而不是警告）并禁止插入值，请使用严格的 SQL 模式。看[第 5.1.11 节，“服务器 SQL 模式”](sql-mode.html).

什么时候`二进制`值被存储，它们用填充值右填充到指定的长度。垫值是`0x00`（零字节）。值右填充`0x00`插入，并且不删除尾随字节以进行检索。所有字节在比较中都很重要，包括`订购方式`和`清楚的`操作。`0x00`和空间不同的比较，与`0x00`在空间之前排序。

示例：对于一个`二进制(3)`柱子，`'一种 '`变成`'一个\0'`插入时。`'一个\0'`变成`'a\0\0'`插入时。两个插入的值在检索时保持不变。

为了`变量`，插入没有填充，也没有字节被剥离以进行检索。所有字节在比较中都很重要，包括`订购方式`和`清楚的`操作。`0x00`和空间不同的比较，与`0x00`在空间之前排序。

对于去除尾随填充字节或比较忽略它们的情况，如果列具有需要唯一值的索引，则将仅在尾随填充字节数不同的值插入列中会导致重复键错误。例如，如果一个表包含`'一种'`, 尝试存储`'一个\0'`导致重复键错误。

如果您打算使用`二进制`存储二进制数据的数据类型，并且您要求检索的值与存储的值完全相同。以下示例说明了如何`0x00`-填充`二进制`values 影响列值比较：

```
mysql> CREATE TABLE t (c BINARY(3));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO t SET c = 'a';
Query OK, 1 row affected (0.01 sec)

mysql> SELECT HEX(c), c = 'a', c = 'a\0\0' from t;
+--------+---------+-------------+
| HEX(c) | c = 'a' | c = 'a\0\0' |
+--------+---------+-------------+
| 610000 |       0 |           1 |
+--------+---------+-------------+
1 row in set (0.09 sec)
```

如果检索到的值必须与为没有填充的存储指定的值相同，则最好使用`变量`或其中之一[`斑点`](blob.html)而是数据类型。

笔记

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