#### 15.9.1.7 SQL 压缩语法警告和错误

本节介绍使用表压缩功能时可能遇到的语法警告和错误[每表文件](glossary.html#glos_file_per_table)表空间和[通用表空间](glossary.html#glos_general_tablespace).

##### File-Per-Table 的 SQL 压缩语法警告和错误

表空间

什么时候[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)启用（默认），指定`ROW_FORMAT=压缩`要么`KEY_BLOCK_SIZE`在[`创建表`](create-table.html)要么[`更改表`](alter-table.html)如果语句产生以下错误[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)被禁用。

```
ERROR 1031 (HY000): Table storage engine for 't1' doesn't have this option
```

笔记

如果当前配置不允许使用压缩表，则不会创建该表。

什么时候[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)被禁用，指定`ROW_FORMAT=压缩`要么`KEY_BLOCK_SIZE`在[`创建表`](create-table.html)要么[`更改表`](alter-table.html)如果语句产生以下警告[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)被禁用。

```
mysql> SHOW WARNINGS;
+---------+------+---------------------------------------------------------------+
| Level   | Code | Message                                                       |
+---------+------+---------------------------------------------------------------+
| Warning | 1478 | InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.        |
| Warning | 1478 | InnoDB: ignoring KEY_BLOCK_SIZE=4.                            |
| Warning | 1478 | InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table. |
| Warning | 1478 | InnoDB: assuming ROW_FORMAT=DYNAMIC.                          |
+---------+------+---------------------------------------------------------------+
```

笔记

这些消息只是警告，而不是错误，并且表是在没有压缩的情况下创建的，就好像没有指定选项一样。

“非严格”行为允许您导入`mysql转储`文件导入到不支持压缩表的数据库中，即使源数据库包含压缩表。在这种情况下，MySQL 在`ROW_FORMAT=动态`而不是阻止操作。

要将转储文件导入新数据库，并重新创建原始数据库中存在的表，请确保服务器具有正确的设置[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)配置参数。

属性`KEY_BLOCK_SIZE`只有当`ROW_FORMAT`被指定为`压缩`或被省略。指定一个`KEY_BLOCK_SIZE`与任何其他`ROW_FORMAT`生成一个您可以查看的警告`显示警告`.但是，该表是未压缩的；指定的`KEY_BLOCK_SIZE`被忽略）。

| 等级 | 代码 | 信息 |
| --- | --- | --- |
| 警告 | 1478 | `InnoDB：忽略 KEY_BLOCK_SIZE=*`n`* 除非 ROW_FORMAT=COMPRESSED。` |

如果你正在运行[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)启用，一个组合`KEY_BLOCK_SIZE`与任何`ROW_FORMAT`以外`压缩`生成错误，而不是警告，并且未创建表。

[表 15.12，“行\_格式和密钥\_堵塞\_尺寸选项”](innodb-compression-syntax-warnings.html#innodb-compression-create-and-alter-options-table)概述了`ROW_FORMAT`和`KEY_BLOCK_SIZE`使用的选项[`创建表`](create-table.html)要么[`更改表`](alter-table.html).

[](<>)

**表 15.12 行\_格式和密钥\_堵塞\_尺寸选项**

| 选项 | 使用说明 | 描述 |
| --- | ---- | --- |
| `ROW_FORMAT=​冗余` | MySQL 5.0.3 之前使用的存储格式 | 效率低于`ROW_FORMAT=紧凑`;为了向后兼容 |
| `ROW_FORMAT=​紧凑` | 自 MySQL 5.0.3 以来的默认存储格式 | 在聚集索引页中存储 768 字节长列值的前缀，其余字节存储在溢出页中 |
| `ROW_FORMAT=​动态` |  | 如果它们适合，则将值存储在聚集索引页面中；如果不是，则仅存储指向溢出页的 20 字节指针（无前缀） |
| `ROW_FORMAT=​压缩` |  | 使用 zlib 压缩表和索引 |
| `KEY_BLOCK_​SIZE=*`n`*` |  | 指定 1、2、4、8 或 16 KB 的压缩页面大小；暗示`ROW_FORMAT=压缩`.对于一般表空间，一个`KEY_BLOCK_SIZE`值等于`InnoDB`页面大小是不允许的。 |

[表 15.13，“InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误”](innodb-compression-syntax-warnings.html#innodb-compression-create-and-alter-errors-table)总结了配置参数和选项的某些组合发生的错误情况[`创建表`](create-table.html)要么[`更改表`](alter-table.html)语句，以及选项如何出现在`显示表状态`.

什么时候[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)是`离开`, MySQL 创建或更改表，但忽略某些设置，如下所示。您可以在 MySQL 错误日志中看到警告消息。什么时候[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)是`在`，这些指定的选项组合会产生错误，并且不会创建或更改表。要查看错误情况的完整描述，请发出`显示错误`声明：示例：

```
mysql> CREATE TABLE x (id INT PRIMARY KEY, c INT)

-> ENGINE=INNODB KEY_BLOCK_SIZE=33333;

ERROR 1005 (HY000): Can't create table 'test.x' (errno: 1478)

mysql> SHOW ERRORS;
+-------+------+-------------------------------------------+
| Level | Code | Message                                   |
+-------+------+-------------------------------------------+
| Error | 1478 | InnoDB: invalid KEY_BLOCK_SIZE=33333.     |
| Error | 1005 | Can't create table 'test.x' (errno: 1478) |
+-------+------+-------------------------------------------+
```

[](<>)

**表 15.13 InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误**

| 句法 | 警告或错误情况 | 结果`ROW_FORMAT`，如图所示`显示表状态` |
| --- | ------- | -------------------------- |
| `ROW_FORMAT=冗余` | 没有 | `多余的` |
| `ROW_FORMAT=紧凑` | 没有 | `袖珍的` |
| `ROW_FORMAT=压缩`要么`ROW_FORMAT=动态`要么`KEY_BLOCK_SIZE`被指定 | 忽略每个表的文件表空间，除非[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)已启用。通用表空间支持所有行格式。看[第 15.6.3.3 节，“通用表空间”](general-tablespaces.html). | `file-per-table 表空间的默认行格式；通用表空间的指定行格式` |
| 无效的`KEY_BLOCK_SIZE`已指定（不是 1、2、4、8 或 16） | `KEY_BLOCK_SIZE`被忽略 | 指定的行格式，或默认的行格式 |
| `ROW_FORMAT=压缩`并且有效`KEY_BLOCK_SIZE`被指定 | 没有;`KEY_BLOCK_SIZE`指定使用 | `压缩` |
| `KEY_BLOCK_SIZE`指定为`多余的`, `袖珍的`要么`动态的`行格式 | `KEY_BLOCK_SIZE`被忽略 | `多余的`, `袖珍的`要么`动态的` |
| `ROW_FORMAT`不是其中之一`多余的`, `袖珍的`,`动态的`要么`压缩` | 如果被 MySQL 解析器识别，则忽略。否则，将发出错误。 | 默认行格式或 N/A |

什么时候`innodb_strict_mode`是`在`, MySQL 拒绝无效`ROW_FORMAT`要么`KEY_BLOCK_SIZE`参数和问题错误。严格模式是`在`默认。什么时候`innodb_strict_mode`是`离开`, MySQL 对忽略的无效参数发出警告而不是错误。

无法查看所选内容`KEY_BLOCK_SIZE`使用`显示表状态`.该声明`显示创建表`显示`键块大小`（即使在创建表时忽略了它）。MySQL无法显示表的实际压缩页面大小。

##### 常规表空间的SQL压缩语法警告和错误

-   如果`文件块大小`未为常规表空间定义创建表空间时，该表空间不能包含压缩表。如果试图添加压缩表，将返回一个错误，如下例所示：

    ```
    mysql> CREATE TABLESPACE `ts1` ADD DATAFILE 'ts1.ibd' Engine=InnoDB;

    mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) TABLESPACE ts1 ROW_FORMAT=COMPRESSED
           KEY_BLOCK_SIZE=8;
    ERROR 1478 (HY000): InnoDB: Tablespace `ts1` cannot contain a COMPRESSED table
    ```

-   试图添加具有无效属性的表`键块大小`返回一个错误，如下例所示：

    ```
    mysql> CREATE TABLESPACE `ts2` ADD DATAFILE 'ts2.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

    mysql> CREATE TABLE t2 (c1 INT PRIMARY KEY) TABLESPACE ts2 ROW_FORMAT=COMPRESSED
           KEY_BLOCK_SIZE=4;
    ERROR 1478 (HY000): InnoDB: Tablespace `ts2` uses block size 8192 and cannot
    contain a table with physical page size 4096
    ```

    对于一般的表空间`键块大小`表的长度必须等于`文件块大小`表空间除以1024。例如，如果`文件块大小`表空间中的`键块大小`桌子的长度必须是8。

-   尝试将未压缩行格式的表添加到配置为存储压缩表的常规表空间会返回错误，如下例所示：

    ```
    mysql> CREATE TABLESPACE `ts3` ADD DATAFILE 'ts3.ibd' FILE_BLOCK_SIZE = 8192 Engine=InnoDB;

    mysql> CREATE TABLE t3 (c1 INT PRIMARY KEY) TABLESPACE ts3 ROW_FORMAT=COMPACT;
    ERROR 1478 (HY000): InnoDB: Tablespace `ts3` uses block size 8192 and cannot
    contain a table with physical page size 16384
    ```

[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)不适用于常规表空间。通用表空间的表空间管理规则严格独立于[`innodb_严格模式`](innodb-parameters.html#sysvar_innodb_strict_mode)。有关更多信息，请参阅[第13.1.21节，“创建表空间语句”](create-tablespace.html).

有关在常规表空间中使用压缩表的更多信息，请参阅[第15.6.3.3节，“通用表空间”](general-tablespaces.html).
