XAMPP MySQL 5.5.8+ 默认引擎为InnoDB,无需修改;若非InnoDB,需在my.ini的[mysqld]段添加default_storage_engine=InnoDB并重启;ALTER TABLE切换引擎会重建表并加锁,大表需谨慎;代码中CREATE TABLE应显式指定ENGINE=InnoDB。

XAMPP 的 MySQL 5.5.8+ 默认就是 InnoDB,改配置前先确认是否真需要动——多数人其实是白忙活。
怎么查当前默认引擎是不是 InnoDB
别猜,连上 MySQL 执行这句:
SHOW VARIABLES LIKE 'default_storage_engine';
如果返回值是 InnoDB,说明已经 OK;如果是 MyISAM 或空,才需要进一步排查。注意:default-storage-engine(带短横线)在 MySQL 5.7+ 已被忽略,只认 default_storage_engine(下划线)。Windows 下 XAMPP 1.7.7+ 全部自带 MySQL 5.5.8 起,默认引擎就是 InnoDB,不用改也能支持事务。
my.ini 里该加哪一行才有效
打开 C:\xampp\mysql\bin\my.ini,确保在 [mysqld] 段落内有且仅有一行:
default_storage_engine=InnoDB
不是 default-storage-engine,也不是 storage_engine(已废弃)。如果文件里有 #skip-innodb,必须删掉或注释掉它,否则 InnoDB 引擎根本不会加载。改完不重启等于没改——Windows 下执行:
net stop mysql && net start mysql
重启后再次运行 SHOW VARIABLES LIKE 'default_storage_engine'; 验证。如果还是旧值,大概率是:改错了段落(写进 [client] 了)、路径不对(XAMPP 有时读 C:\Windows\my.ini)、或者配置被其他同名项覆盖。
ALTER TABLE 切换老表时为什么卡住或失败
ALTER TABLE your_table ENGINE=InnoDB; 不是“改个参数”,而是重建整张表:MySQL 会新建一个 InnoDB 表、逐行拷贝数据、删原表、重命名。这个过程:
- 大表(比如 >1GB)可能卡住几分钟甚至更久
- 期间原表会被加写锁(MyISAM)或独占锁(InnoDB),写入请求阻塞
- 需要额外磁盘空间(同时存两份数据),空间不足直接报错
- MyISAM 的全文索引、压缩、
AUTO_INCREMENT值等不会自动迁移,得手动补建
安全做法是加在线 DDL 参数(MySQL 5.6+):
ALTER TABLE log_table ENGINE=InnoDB, ALGORITHM=COPY, LOCK=NONE;
转换完记得跑一句 ANALYZE TABLE log_table; 更新统计信息,否则后续查询可能走错执行计划。
真正要改的不是配置,是代码里的 CREATE TABLE
配置只影响 CREATE TABLE 不带 ENGINE= 子句的情况。但很多老项目、WordPress 插件、Laravel Migration、甚至 phpMyAdmin 导出脚本,都显式写了 ENGINE=MyISAM 或压根没写(靠旧版默认兜底)。这类语句会完全绕过配置项。
搜索整个项目代码,重点替换:
- 所有
ENGINE=MyISAM→ 改成ENGINE=InnoDB - 所有裸
CREATE TABLE(无 ENGINE)→ 补上ENGINE=InnoDB - Laravel 中
Schema::create()后加->engine('InnoDB') - WordPress 插件中检查
dbDelta()是否传了ENGINE=InnoDB
大小写不敏感但建议统一用大写,避免漏匹配 engine=myisam 这类小写变体。
最常被忽略的一点:innodb_force_recovery 设为非 0 值(比如 1)会导致表变成只读,报错 #1036 table is read only,此时任何 ALTER TABLE 都会失败——得先去 my.ini 把它设回 0。


















