暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL:sql_mode参数使用详解之NO_ENGINE_SUBSTITUTION

小小亮 2021-08-12
2890

背景

MySQL数据库可以通过参数sql_mode来控制数据库的行为,本文介绍sql_mode的取值之一:NO_ENGINE_SUBSTITUTION。它的用途是:当CREATE TABLE或ALTER TABLE之类的语句指定一个已禁用或未编译的存储引擎时,控制默认存储引擎的自动替换。

问题现象

为什么想创建一个FEDERATED引擎的表,结果显示却是InnoDB引擎:

CREATE TABLE tb_01 (
id int(11) NOT NULL AUTO_INCREMENT,
age int(11) NOT NULL DEFAULT '0',
name varchar(64) NOT NULL DEFAULT '',
PRIMARY KEY (id)
) ENGINE=FEDERATED;
复制

执行命令后,显示结果如下:

image.png

原因分析

导致以上现象发生需要三方面的因素:

  1. 当前RDS实例不支持FEDERATED引擎,登录数据库执行下面的SQL命令:
SHOW ENGINES;
复制

image.png

  1. sql_mode设置中不含NO_ENGINE_SUBSTITUTION,登录数据库执行下面的SQL命令:
SHOW VARIABLES LIKE 'sql_mode';
复制

image.png

  1. 当前RDS实例的默认存储引擎是InnoDB,登录数据库执行下面的SQL命令:
SHOW VARIABLES LIKE 'default_storage_engine';
复制

image.png

说明:当在sql_mode中不设置NO_ENGINE_SUBSTITUTION,且CREATE TABLE中的ENGINE子句指定的存储引擎不被当前数据库实例支持时,MySQL会把表的引擎改为默认存储引擎(InnoDB)。

解决方案

  • 方案一:给数据库实例安装FEDERATED引擎
  • 方案二:设置sql_mode包含NO_ENGINE_SUBSTITUTION,这样可以给出明确的报错提示避免误解,如下例:

image.png

结论建议

从稳定性和性能多方面考虑,针对MySQL数据库中的存储引擎,推荐使用InnoDB引擎,不建议使用其他引擎如:MyISAM、MEMORY等。



文章来源:https://cloud.baidu.com/doc/RDS/s/8jyziqboo

最后修改时间:2021-08-12 14:29:14
文章转载自小小亮,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论