查表结构最稳最快方式是直接查information_schema.columns和tables,因show create table受会话变量、版本、格式等干扰易致误判。

直接查 information_schema.COLUMNS 和 information_schema.TABLES 是最稳、最快、不依赖外部工具的方式——只要账号有 SELECT 权限,连 mysqldiff 都不用装。
为什么别用 SHOW CREATE TABLE 直接字符串比对
SHOW CREATE TABLE 输出受会话变量、MySQL 版本、默认值填充(如 AUTO_INCREMENT=123)、反引号风格、换行缩进影响,两次执行同一张表都可能不同。人工或 diff 工具一比就报一堆“差异”,但实际结构完全一致。
- 字段顺序在 ALTER 后可能被重排,
PRIMARY KEY (a,b)和(b,a)字符串不同,语义也不同,但靠肉眼 diff 很难识别 - 注释里的空格、换行、中文标点风格不一致,也会触发假阳性
-
ENGINE、CHARSET、ROW_FORMAT这些关键表级属性,在输出里可能被隐式补全,也可能被省略,不可信
用 GROUP_CONCAT 生成结构指纹快速判断是否一致
把列定义关键字段拼成标准化字符串,再哈希或直接比较,5 秒内知道「是不是完全一样」。
- 必须包含:
COLUMN_NAME、DATA_TYPE、IS_NULLABLE、IFNULL(COLUMN_DEFAULT,'NULL')、IFNULL(COLUMN_COMMENT,'')、EXTRA、ORDINAL_POSITION - 必须按
ORDINAL_POSITION排序拼接,顺序不同 = 结构不同 - 示例(查库
db1表t1):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执行同样语句,两个结果复制出来用==或diff命令比即可
ENGINE、字符集等表级属性必须单独查 information_schema.TABLES
information_schema.COLUMNS 不管引擎、编码、排序规则——这些差异不会报错,但会导致事务失败、锁失效、外键静默忽略等线上事故。
- 查引擎是否统一:
SELECT table_schema, table_name, engine FROM information_schema.tables WHERE table_schema NOT IN ('mysql','information_schema','performance_schema','sys') AND engine != 'InnoDB'; - 查字符集与排序规则:
SELECT table_schema, table_name, table_collation FROM information_schema.tables WHERE table_schema = 'db1' AND table_name = 't1' UNION ALL SELECT table_schema, table_name, table_collation FROM information_schema.tables WHERE table_schema = 'db2' AND table_name = 't1';
- 注意:
SHOW CREATE TABLE显示的ENGINE=MyISAM可能是历史残留,MySQL 8.0+ 实际运行时已转为 InnoDB;以information_schema.tables.engine字段为准
mysqldump --no-data + sed 是最可靠的跨库结构比对方案
当需要详细差异报告(比如给 DBA 写同步清单),又不能用已停更的 mysqldiff 时,原生命令组合最可控。
- 导出结构要加
--skip-comments(去掉/*!50100 ... */条件注释)、--compact(减少空格换行)、--no-data(只取 DDL) - 用
sed标准化空格:sed -e 's/[[:space:]]*$//' -e 's/[[:space:]]\+/ /g' - 关键一步:对两个 SQL 文件先
sort再diff,能消除列顺序带来的噪音 - 命令示例:
mysqldump -uuser -psecret --no-data --skip-comments --compact db1 t1 | sed -e 's/[[:space:]]*$//' -e 's/[[:space:]]\+/ /g' | sort > t1_db1.sql mysqldump -uuser -psecret --no-data --skip-comments --compact db2 t1 | sed -e 's/[[:space:]]*$//' -e 's/[[:space:]]\+/ /g' | sort > t1_db2.sql diff t1_db1.sql t1_db2.sql
真正容易被忽略的是:字段顺序、EXTRA(比如 auto_increment)、以及 ENGINE 这三类差异——它们不会让 CREATE TABLE 报错,但会让应用在某个并发场景下静默错乱,且极难复现。











