mysql 5.5+默认存储引擎为innodb,旧版或配置异常时默认可能是myisam;需通过select @@default_storage_engine确认,默认值须在my.cnf的[mysqld]段用default-storage-engine=innodb配置并重启生效,建表时仍推荐显式指定engine=innodb。

MySQL 5.5 及之后版本默认就是 InnoDB,但如果你用的是旧版(如 5.1/5.2)、或被人为改过、或部署环境未显式指定,CREATE TABLE 不带 ENGINE 子句时仍可能落到 MyISAM 上——这会直接导致外键失效、事务不可用、崩溃恢复能力弱等问题。必须显式设为 InnoDB 才算真正可靠。
确认当前默认引擎是否已是 InnoDB
连上 MySQL 后执行:
SELECT @@default_storage_engine;
如果返回 MyISAM 或空值,说明没生效。别只看 SHOW ENGINES 里 InnoDB 是否为 YES——那只是表示支持,不等于默认。
永久生效:改 my.cnf(或 my.ini)配置文件
这是最常用也最稳妥的方式,影响所有新连接和新建表。注意三点:
-
default-storage-engine必须写在[mysqld]段下,写在[client]或全局段无效 - 参数名是
default-storage-engine(带短横线),不是default_storage_engine(下划线)——后者在旧版本中曾用,但 5.6+ 已弃用 - 修改后必须重启
mysqld进程才生效,FLUSH PRIVILEGES或RELOAD不起作用
正确写法示例:
[mysqld] default-storage-engine = InnoDB
临时生效:仅对当前会话或当前连接生效
适合测试、调试或无法改配置文件的场景,但重启连接即失效:
- 会话级(当前连接):
SET SESSION default_storage_engine = InnoDB; - 全局级(影响后续所有新连接,但不持久):
SET GLOBAL default_storage_engine = InnoDB;(需 SUPER 权限)
注意:SET storage_engine = InnoDB 是 5.5 以前的旧语法,已废弃;5.7+ 会警告,8.0+ 直接报错 Unknown system variable 'storage_engine'。
建表时强制指定 & 验证是否真生效
即使设了默认引擎,也要养成显式写 ENGINE=InnoDB 的习惯,尤其在自动化脚本或迁移场景中:
CREATE TABLE t (id INT PRIMARY KEY) ENGINE=InnoDB;
验证方式不止看 @@default_storage_engine,更要查表实际引擎:
SHOW CREATE TABLE t\G
输出里必须明确出现 ENGINE=InnoDB。常见坑是:配置改了但忘了重启 MySQL,或者改错了配置文件路径(比如改了 /etc/my.cnf 却实际加载的是 /etc/mysql/my.cnf),结果 mysqld --verbose --help | grep "default-storage-engine" 显示的仍是 MyISAM。











