mysql sql_mode 之 NO_ENGINE_SUBSTITUTION

知识储备:

  1、mysql 有众多的存储引擎,然而只有一个默认的存储引擎,通常来说它是innodb

  2、mysql 可以通过sql_mode 来控制mysql 数据库的行为,今天我们要讲的就是no_engine_substitution

  3、no_engine_subtitution的作用:mysql 在create table 时可以指定engine子句;这个engine子句用于指定表的存储引擎,那么问题就来了。

     如果我把引擎指定成一个并不存在的引擎!这个时候mysql可以有两种行为供选择 1、直接报错;2、把表的存储引擎替换成innodb

例子:

  1、环境检查(查看mysql所支持的存储引擎,sql_mode模式)

  001:存储引擎,由下图可以看出在这个mysql上不支持federated 引擎

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

  002:sql_mode

mysql> show variables like ‘sql_mode‘;
+---------------+---------------------+
| Variable_name | Value               |
+---------------+---------------------+
| sql_mode      | STRICT_TRANS_TABLES |
+---------------+---------------------+
1 row in set (0.00 sec)

  003:测试

mysql> create table t(x int) engine=federated;
Query OK, 0 rows affected, 2 warnings (0.11 sec)

mysql> show create table t;
+-------+--------------------------------------------------------------------------------------+
| Table | Create Table                                                                         |
+-------+--------------------------------------------------------------------------------------+
| t     | CREATE TABLE `t` (
  `x` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1 |
+-------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

结论001:在sql_mode中不包涵no_engine_subtitution 且create table 中engine子句指定的存储引擎不被支持时,mysql会把表的引擎改为innodb。

例子:

  在sql_mode包涵有no_engine_subtitution时

  引擎支持情况:

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

  sql_mode情况:

mysql> show variables like ‘sql_mode‘;
+---------------+--------------------------------------------+
| Variable_name | Value                                      |
+---------------+--------------------------------------------+
| sql_mode      | STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION |
+---------------+--------------------------------------------+
1 row in set (0.00 sec)

  测试:

mysql> create table t2(x int) engine=federated;
ERROR 1286 (42000): Unknown storage engine ‘federated‘

结论002:当sql_mode中包涵no_engine_subtitution时,如果create table 时指定的engine项不被支持,这个时候mysql会支持报错。

时间: 2024-10-20 12:28:03

mysql sql_mode 之 NO_ENGINE_SUBSTITUTION的相关文章

【转】MySQL sql_mode 说明(及处理一起 sql_mode 引发的问题)

1. MySQL 莫名变成了 Strict SQL Mode 最近测试组那边反应数据库部分写入失败,app层提示是插入成功,但表里面里面没有产生数据,而两个写入操作的另外一个表有数据.因为 insert 失败在数据库层面是看不出来的,于是找php的同事看下错误信息: [Err] 1364 - Field `f_company_id` doesn't have a default value 很明显2个 insert 操作,第一条成功,第二条失败了,但因为没有控制在一个事务当中,导致app里面依然

十二、mysql sql_mode 简学

1.一般默认情况下sql_mode默认为空,也就是不严格的sql检查 2.如果sql_mode为空的情况下,测试: create table tt3 (name char(2)); //定义一个name字段长度为定长2的tt3表 insert into tt3 values ('wo'); //正常插入,无措 insert into tt3 values ('woshi'); //正常插入,但值已被截取成了“wo” 修改sql_mode为严格模式: set session sql_mode =

docker 下修改 mysql sql_mode和配置文件

原文:docker 下修改 mysql sql_mode和配置文件 打开PowerShell 首先创建mysql容器,这里我们指定使用mysql5.7的版本 docker run -d -p 3306:3306 --name mysql-docker -e MYSQL_ROOT_PASSWORD=root mysql:5.7 创建成功,查看一下运行状态 docker ps ? 可以看到我们的容器正在运行中,现在进入容器,查看一下配置文件 ? docker exec -it mysql-docke

MySQL sql_mode设置

在MySQL5.7版本中创建表 CREATE TABLE `investor_seat` ( `id` int(11) NOT NULL AUTO_INCREMENT , `investorId` int(11) NOT NULL COMMENT '投资人id', `seatId` int(11) NOT NULL COMMENT '席位id', `maybe` float NOT NULL COMMENT '席位归属某帮派或者某人的概率', `investorName` varchar(28)

MySQL::SQL_MODE

SQL_MODE可能是比较容易让开发人员和DBA忽略的一个变量,默认为空.SQL_MODE的设置其实是比较冒险的一种设置,因为在这种设置下可以允许一些非法操作,比如可以将NULL插入NOT NULL的字段中,也可以插入一些非法日期,如“2012-12-32”.因此在生产环境中强烈建议开发人员将这个值设为严格模式,这样有些问题可以在数据库的设计和开发阶段就能发现,而如果在生产环境下运行数据库后发现这类问题,那么修改的代价将变得十分巨大.此外,正确地设置SQL_MODE还可以做一些约束(Constr

mysql sql_mode=only_full_group_by 错误解析(待确认)

1.错误提示: 2.检查参数设置: 3.mysql的配置文件my.cnf里面可以修改, 但是,改完以后,你检查所有的参数设置都是对的,就是运行不了.怎么办?怎么办? 4.如果还是不行而且确定修改了.那这个问题就麻烦了.我是在存储过程里面遇到问题. 在mysql里面调用,没有问题.但是在代码里面调用了不行,检查,检查 show create procedure aaa; 然后发现了什么? 正常的,对的: 而出问题的: 问题总结: 在初始的时候,mysql的配置文件没有修改 mysql_mode,导

MySQL sql_mode=only_full_group_by错误

今天在测试服务器上突然出现了这么一个MySQL的问题,同样的代码正式服没有问题,那肯定就是出在了配置上,查了一下原因才明白原来是数据库版本为5.7以上的版本, 默认是开启了 only_full_group_by 模式的,但开启这个模式后,原先的 group by 语句就报错, 查询MySQL版本可以在命令行模式刚连接上数据库时就能看到,或者在进入mysql后使用命令:status查看版本号, 既然是版本的问题,那就查询一下配置看看具体的情况,命令行连接上数据库,再输入命令: select @@s

大牛的MySQL5.7配置文件解释,方便查看

[mysql] prompt = [\\[email protected]\\h][\\d]>\\_ [mysqld] # basic settings # user = mysql sql_mode = "STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER" autocommit = 1 cha

MySQL或者MariaDB里面sql_mode的设置详解

详见MySQL5.6手册的"Server SQL Modes"章节. 地址:http://dev.mysql.com/doc/refman/5.6/en/sql-mode.html 参考了好几个网站的博文,出处不太好找了,对大家的分享表示感谢. MySQL5.6的sql_mode是STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION MariaDB10.0.17的sql_mode是空的. sql_mode 分为global.session作用范围. &g