按类别整理,同时附带错误示例、原因、修正写法,覆盖 MySQL / PostgreSQL /openGauss/ 达梦 等常见库。
说明:有些属于语法兼容问题(A 库合法、B 库报错),很多人会当成语法错误。
一、符号、引号、分号类(最高发)
漏写 / 多写分号
;
-- 错误:少分号,语句粘连
select * from user
insert into user(name) values('a');
-- 错误:存储过程/函数体内多余分号,配合 DELIMITER 时踩坑
DELIMITER ;
CREATE PROC p()
BEGIN
select 1;
END;
DELIMITER ;
MySQL 导入脚本最经典坑:写存储过程前忘记改分隔符
DELIMITER //
单双引号混用、中文引号(全角)
-- 错误:全角引号 “ ” ‘ ’
select * from t where name = “张三”;
-- 错误:PostgreSQL 字符串必须单引号,双引号是标识符
select * from t where name = "张三";
✅ 规则:字符串值用半角单引号 ';标识符(表名 / 字段名)MySQL 反引号 `,PG/openGauss 双引号 "
字符串内单引号没有转义
-- 错误:内容包含单引号,截断SQL
insert into t(remark) values('it's ok');
-- 正确:两个单引号转义
insert into t(remark) values('it''s ok');
注释符号不规范
-- 错误:# 注释只MySQL支持,PG/Oracle不识别
# 这是注释
-- 错误:/* 多行注释没有闭合
/* select * from t
二、标识符、关键字、保留字问题
表名 / 字段名是 SQL 保留字,没加转义符
-- error:order、desc、user、group、status 很多是关键字
select order from t;
-- mysql:
select `order` from t;
-- pg/openGauss:
select "order" from t;
常见高危保留字:order、group、user、desc、limit、offset、table、values、primary
表名、字段名带空格、特殊字符未转义
-- 错误
select user name from t;
-- mysql
select `user name` from t;

三、DML 语句(INSERT / UPDATE / DELETE / SELECT)
INSERT 字段列表和值列表数量不一致
-- 字段3个,值只有2个
insert into t(a,b,c) values(1,2);
VALUES 多行写法逗号写错
-- 错误:行之间用分号而不是逗号
insert t(a) values (1);(2);
-- 正确
insert t(a) values (1),(2);
UPDATE 忘记 WHERE(不是语法错,是逻辑灾难),或者 WHERE 条件写错
update user set name='xxx'; -- 全表更新!
聚合函数不在 GROUP BY 里(ONLY_FULL_GROUP_BY 模式报错)
-- mysql 开启严格模式报错
select id,name,max(score) from student group by id;
JOIN 语法错误:缺少 ON、逗号和 JOIN 混用混乱
-- 错误
select * from a join b where a.id=b.a_id;
-- 标准写法
select * from a join b on a.id=b.a_id;
LIMIT / OFFSET 参数非数字、负数
select * from t limit -10;
四、DDL 语句(CREATE / ALTER / DROP)高频错
主键、唯一键重复定义;主键字段允许 NULL
-- 错误:主键不能 null
create table t(id int primary key null);
数据类型写错、长度非法
-- mysql:varchar 不能负数、超大长度
name varchar(-10)
ALTER 修改不存在的字段 / 删除不存在的索引
alter table t drop column xxx; -- 字段不存在
外键约束:引用表 / 字段不存在、类型不一致、引擎不支持(MyISAM 无外键)
foreign key (uid) references user(uid)
-- 坑:两个字段字符集、int长度不一致,直接创建失败
DEFAULT 默认值类型不匹配
create table t(
status int default 'abc'
);
五、函数、存储过程、触发器、变量语法
函数参数、返回类型写错,缺少 RETURN
CREATE FUNCTION f() RETURNS INT
BEGIN
SELECT 1;
END; -- 缺少 return
变量声明位置错误(必须在最开头 DECLARE)
BEGIN
select 1;
declare v int; -- 错误,declare要在所有语句之前
END
赋值语法混淆:
=和:=MySQL 存储过程里=在 where 里是比较,赋值推荐:=
set v = 1; -- set语法里可以
select v := 1;
触发器 OLD/NEW 使用错误:INSERT 没有 OLD,DELETE 没有 NEW

六、导入 SQL 文件时特有的坑(看着像语法错,实际是环境问题)
编码问题:文件 UTF8-BOM 头部 文件开头带 BOM 不可见字符,数据库解析第一行直接报语法错误,肉眼看不到。 ✅ 解决:编辑器另存为 UTF-8(无 BOM)
换行符问题 Windows CRLF / Linux LF 少数老驱动、国产库解析
\r当成非法字符报错。SQL_MODE 严格模式差异 MySQL
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,本地能跑,线上报错。注释里包含特殊字符、
;干扰解析器
-- 导出脚本注释里写:删除表;测试
DROP TABLE IF EXISTS t;
导入工具按 ; 切割,容易切错。
扩展语法跨库不兼容(非常常见,属于 “移植报错”)
七、事务、锁、脚本控制语句错误
-- 错误:commit / rollback 拼写错误;begin 和 start transaction混用
beginn;
-- 错误:SAVEPOINT 名字不存在
rollback to sp1;
八、快速自查清单(你校验 sql 文件时可以对照)
文件编码 UTF-8 无 BOM
全部是半角符号,没有中文引号逗号
字符串单引号正确转义
关键字字段都加标识符包裹(反引号 / 双引号)
存储过程提前设置
DELIMITER每条语句
;位置正确多行 INSERT 值逗号分隔正确
DDL 外键两边字段类型、字符集一致
区分数据库方言:不要把 MySQL 语法直接丢 PG / 达梦
本文原创作者:易君召,详见:https://www.yijunzhao.cn/authors/yijunzhao,转载请注明出处。
原文链接
欢迎访问 小易撩挨踢