直接查information_schema.columns和tables最稳,因show create table输出受字段顺序、auto_increment值、注释格式、隐式默认值等影响易产生假差异;需用group_concat生成有序结构指纹比对,并单独校验engine和charset。

直接查 information_schema.COLUMNS 和 information_schema.TABLES 是最稳、最可控的方式,不依赖外部工具,也不受 MySQL 版本弃用影响。
为什么别用 SHOW CREATE TABLE 直接字符串比对
SHOW CREATE TABLE 输出不稳定:字段顺序可能因 ALTER TABLE ADD COLUMN 被重排;AUTO_INCREMENT=123 这类运行时值每次执行都可能变;注释里的空格、换行、反引号风格不一致;ENGINE 和 CHARSET 默认值会被隐式补全,导致“结构相同但输出不同”。人工肉眼或 diff 一跑,全是假差异。
用 GROUP_CONCAT 生成结构指纹快速判断是否完全一致
只关心“是不是一模一样”,不想逐字段核对几十列?用这个 SQL 生成可比对的结构签名:
SELECT GROUP_CONCAT(
CONCAT(
COLUMN_NAME, ':', DATA_TYPE, ':', IS_NULLABLE, ':',
IFNULL(COLUMN_DEFAULT, 'NULL'), ':',
IFNULL(COLUMN_COMMENT, ''), ':',
EXTRA
) ORDER BY ORDINAL_POSITION SEPARATOR ';'
) AS sig
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'db1' AND TABLE_NAME = 't1';
对另一个表(比如 db2.t1)执行同样语句,把两个 sig 结果复制出来直接用 == 比较。注意必须加 ORDER BY ORDINAL_POSITION,否则字段顺序不同就误判为不一致;COLUMN_DEFAULT 一定要用 IFNULL 统一处理,否则 NULL 和显式 DEFAULT NULL 会被当成不同。
必须单独查 information_schema.TABLES 校验引擎和字符集
information_schema.COLUMNS 只管字段,不管 ENGINE、CHARSET、ROW_FORMAT 这些表级属性。而 ENGINE=InnoDB 和 ENGINE=MyISAM 混用会导致事务失效、SELECT FOR UPDATE 静默忽略、外键约束不校验等 runtime 行为错乱。
- 执行:
SELECT table_schema, table_name, engine, table_collation FROM information_schema.tables WHERE TABLE_SCHEMA IN ('db1', 'db2') AND TABLE_NAME = 't1'; - 对比两行结果中
engine和table_collation是否完全一致 - 别信
SHOW CREATE TABLE里写的ENGINE=MyISAM——MySQL 8.0+ 可能已隐式转为 InnoDB,元数据中的engine字段才是真相
mysqldiff 已停更,真要用得加关键参数
如果你环境里还装着 mysqldiff(MySQL 5.6/5.7),它默认跳过 ENGINE、CHARSET 等表级选项,即使两个表一个 InnoDB 一个 MyISAM,也会报 No differences found。
- 必须加
--skip-table-options=0(注意是=0,不是不带值)才启用引擎、字符集比对 - 连接参数要显式写全:
--server1=user:pass@host1:3306,它不读~/.my.cnf - 密码含
@、/等特殊字符时,必须 URL 编码,比如pass@123→pass%40123
真正容易被忽略的是:字段顺序、EXTRA(如 auto_increment)、COLUMN_DEFAULT 的 NULL 处理、以及引擎与字符集这四项——漏掉任一,都可能让“结构一致”的判断在上线后引发静默故障。











