Documentation Home
MySQL 8.0 参考手册  / 第 15 章 InnoDB 存储引擎  / 15.9 InnoDB 表和页压缩  /  14.9.7 SQL 压缩语法警告和错误

14.9.7 SQL 压缩语法警告和错误

如果未启用 Barracuda 文件格式,则在or语句中 指定ROW_FORMAT=COMPRESSEDor 会产生以下警告。您可以使用语句 查看它们。KEY_BLOCK_SIZECREATE TABLEALTER TABLESHOW WARNINGS

等级 代码 信息
警告 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_per_table.
警告 1478 InnoDB: KEY_BLOCK_SIZE requires innodb_file_format=1
警告 1478 InnoDB: ignoring KEY_BLOCK_SIZE=4.
警告 1478 InnoDB: ROW_FORMAT=COMPRESSED requires innodb_file_per_table.
警告 1478 InnoDB: assuming ROW_FORMAT=COMPACT.

笔记:

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

  • 启用时innodb_strict_mode,MySQL 会为这些情况生成错误,而不是警告。如果当前配置不允许使用压缩表,则不会创建该表。

非严格”行为允许您将 mysqldump文件导入不支持压缩表的数据库,即使源数据库包含压缩表。在这种情况下,MySQL 会创建表 ROW_FORMAT=COMPACT而不是阻止操作。

要将转储文件导入新数据库,并重新创建原始数据库中存在的表,请确保服务器具有正确的配置参数设置 innodb_file_formatinnodb_file_per_table.

仅当指定为 或省略KEY_BLOCK_SIZE时才允许 该属性。与任何其他 指定 a 会生成一条警告,您可以使用 查看。但是,该表未压缩;指定的被忽略)。 ROW_FORMATCOMPRESSEDKEY_BLOCK_SIZEROW_FORMATSHOW WARNINGSKEY_BLOCK_SIZE

等级 代码 信息
警告 1478 InnoDB: ignoring KEY_BLOCK_SIZE=n unless ROW_FORMAT=COMPRESSED.

如果您在 innodb_strict_mode启用的情况下运行,则 aKEY_BLOCK_SIZE与除任何 ROW_FORMAT以外 的组合会COMPRESSED生成错误,而不是警告,并且不会创建表。

表 14.5,“ROW_FORMAT 和 KEY_BLOCK_SIZE 选项” 概述了与或 一起使用 的ROW_FORMAT和 选项。 KEY_BLOCK_SIZECREATE TABLEALTER TABLE

表 14.5 ROW_FORMAT 和 KEY_BLOCK_SIZE 选项

选项 使用说明 描述
ROW_FORMAT=​REDUNDANT MySQL 5.0.3 之前使用的存储格式 效率低于ROW_FORMAT=COMPACT; 为了向后兼容
ROW_FORMAT=​COMPACT 自 MySQL 5.0.3 以来的默认存储格式 在聚簇索引页中存储前缀为 768 字节的长列值,其余字节存储在溢出页中
ROW_FORMAT=​DYNAMIC 仅适用于 innodb_file​_format=Barracuda 如果适合,则将值存储在聚簇索引页中;如果不是,则仅存储指向溢出页的 20 字节指针(无前缀)
ROW_FORMAT=​COMPRESSED 仅适用于 innodb_file​_format=Barracuda 使用 zlib 压缩表和索引
KEY_BLOCK_​SIZE=n 仅适用于 innodb_file​_format=Barracuda 指定 1、2、4、8 或 16 KB 的压缩页面大小;暗示 ROW_FORMAT=COMPRESSED

表 14.6,“InnoDB 严格模式关闭时的 CREATE/ALTER TABLE 警告和错误”CREATE TABLE总结了or 语句 上配置参数和选项的某些组合发生的错误情况, ALTER TABLE以及这些选项如何出现在SHOW TABLE STATUS.

innodb_strict_mode是 时OFF,MySQL 创建或更改表,但忽略某些设置,如下所示。您可以在 MySQL 错误日志中看到警告消息。当 innodb_strict_mode是 时ON,这些指定的选项组合会产生错误,并且不会创建或更改表。要查看错误情况的完整描述,请发出以下 SHOW ERRORS语句:示例:

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

->ENGINE=INNODB KEY_BLOCK_SIZE=33333;

ERROR 1005 (HY000): 无法创建表 'test.x' (errno: 1478)

数据库>SHOW ERRORS;
+--------+------+-------------------------------- ----------+
| 级别 | 代码 | 留言 |
+--------+------+-------------------------------- ----------+
| 错误 | 第 1478 章 InnoDB:无效的 KEY_BLOCK_SIZE=33333。|
| 错误 | 1005 | 无法创建表“test.x”(错误号:1478)|
+--------+------+-------------------------------- ----------+

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

句法 警告或错误情况 结果ROW_FORMAT,如图SHOW TABLE STATUS
ROW_FORMAT=REDUNDANT 没有任何 REDUNDANT
ROW_FORMAT=COMPACT 没有任何 COMPACT
ROW_FORMAT=COMPRESSEDROW_FORMAT=DYNAMICKEY_BLOCK_SIZE指定 忽略,除非同时 启用 和innodb_file_format=Barracudainnodb_file_per_table COMPACT
指定无效KEY_BLOCK_SIZE(不是 1、2、4、8 或 16) KEY_BLOCK_SIZE被忽略 请求的行格式,或COMPACT默认
ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE指定有效 没有任何; KEY_BLOCK_SIZE指定被使用 COMPRESSED
KEY_BLOCK_SIZE指定为 REDUNDANT,COMPACTDYNAMIC行格式 KEY_BLOCK_SIZE被忽略 REDUNDANT,COMPACT或者 DYNAMIC
ROW_FORMAT不是 REDUNDANT, COMPACT, DYNAMICCOMPRESSED 如果被 MySQL 解析器识别则忽略。否则,将发出错误。 COMPACT或不适用

innodb_strict_modeONMySQL 拒绝无效 ROW_FORMATKEY_BLOCK_SIZE 参数。为了与早期版本的 MySQL 兼容,默认情况下不启用严格模式;相反,MySQL 会针对忽略的无效参数发出警告(而非错误)。

KEY_BLOCK_SIZE使用 无法查看所选内容 SHOW TABLE STATUS。该语句SHOW CREATE TABLE显示KEY_BLOCK_SIZE (即使它在创建表时被忽略)。MySQL无法显示表的真实压缩页大小。