union要求两侧列数、顺序、数据类型、校对规则和列别名严格一致,缺一不可;列数不等报error 1222,顺序错位导致业务逻辑错误,类型不兼容需显式转换,collation不一致报error 1267,别名仅以首个select为准。

UNION两侧列数和顺序必须严格一致
UNION不是“智能拼接”,它按位置对齐列:第一个SELECT的第1列和第二个SELECT的第1列合并为结果集的第1列,以此类推。列数不等会直接报错,比如ERROR 1222 (21000): The used SELECT statements have a different number of columns。
实操建议:
- 绝对不要在任一子查询中用
SELECT *——表结构微调(如加字段)就会让视图或查询突然失败 - 每个
SELECT都显式写出相同数量的列,哪怕某张表没有对应字段,也要用NULL或CAST(NULL AS VARCHAR(50))占位 - 顺序错位比少列更隐蔽:比如
SELECT name, id FROM t1UNIONSELECT user_id, full_name FROM t2,结果里第一列是name和user_id混杂,业务逻辑必然出错
数据类型不兼容时必须显式转换
MySQL/PostgreSQL/SQL Server对类型隐式转换的宽容度不同,但靠隐式转换风险极高。常见错误是ERROR 1267 (HY000): Illegal mix of collations(校对规则冲突)或ERROR 1064(类型无法匹配),尤其出现在CHAR/VARCHAR字段混用不同collation时。
实操建议:
- 字符类型统一用
CAST(col AS CHAR CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci),避免utf8mb4_general_ci和utf8mb4_0900_as_cs混用 - 数值类型差异(如
TINYINTvsINT)通常可隐式转换,但DATE和VARCHAR之间必须CAST(date_col AS CHAR)或STR_TO_DATE(str_col, '%Y-%m-%d') - 布尔字段在MySQL里是
TINYINT(1),PostgreSQL是BOOLEAN,跨库写UNION时一律转成INT或CHAR(1)更稳妥
列别名只生效于第一个SELECT
最终结果集的列名完全由第一个SELECT决定,后续子查询里的别名会被忽略。如果程序代码按full_name取值,但第一个SELECT写的是name,运行时就抛Unknown column 'full_name'异常。
实操建议:
- 所有子查询中,关键列必须在第一个
SELECT里用明确别名,例如SELECT id AS user_id, name AS display_name FROM users - 后续子查询即使字段名不同,也要对齐别名:
SELECT uid AS user_id, fullname AS display_name FROM admins - 别名里避免空格和特殊字符;若必须用,MySQL需反引号
`display name`,SQL Server用方括号[display name],但跨平台场景下建议全用下划线
校对规则(collation)不一致是静默陷阱
两个VARCHAR字段类型相同、长度相同,但collation不同(比如一个用utf8mb4_general_ci,另一个用utf8mb4_0900_as_cs),UNION会直接失败,报Illegal mix of collations for operation 'UNION'。这个错误不会在建表时暴露,只在执行UNION时触发。
实操建议:
- 先用这条语句查出问题字段:
SELECT TABLE_NAME, COLUMN_NAME, COLLATION_NAME FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'your_db' AND DATA_TYPE IN ('varchar', 'char', 'text') AND COLLATION_NAME != 'utf8mb4_unicode_ci' - 批量修复用
ALTER TABLE t MODIFY COLUMN c VARCHAR(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci - 临时应急可在SELECT里强制指定:
SELECT name COLLATE utf8mb4_unicode_ci FROM t1 UNION SELECT title COLLATE utf8mb4_unicode_ci FROM t2,但治标不治本










