ERROR 1064 表示 SQL 语法错误,主因是关键字拼错、标点遗漏、保留字未加反引号;sql_safe_updates=1 会静默拒绝无有效 WHERE 的 UPDATE/DELETE。
ERROR 1064 就该先看 SQL 有没有拼错关键字这是 MySQL 最常见的语法错误,本质是解析器在某个位置“看不懂”你写的 SQL。不是所有拼写错误都会报这个码,但绝大多数 ERROR 1064 都指向关键词、标点或保留字误用。
SELECT * FROM user WHERE name = '张三' ORDER BY id ASC LIMIT 10 OFFSET —— 后面漏了数字,会直接报 ERROR 1064
GROUP BY 写成 GROUPBY(少空格),或 INNER JOIN 写成 INNTER JOIN(多字母)order、group、rank 这类词当字段名却没加反引号:SELECT rank FROM users → 应写成 SELECT `rank` FROM users
json 是保留字,CREATE TABLE t(json TEXT) 会失败,得写成 `json`
MySQL 默认开启 sql_safe_updates=1,它会拒绝没有 WHERE 条件或 WHERE 不含主键/索引列的修改语句——这不是报错,而是静默拒绝,容易让人误以为 SQL 执行成功了。
SELECT @@sql_safe_updates;,返回 1 表示启用SET sql_safe_updates = 0;
SELECT 复现 WHERE 条件:SELECT id FROM orders WHERE status = 'pending' AND updated_at ,确认能查出预期行数再执行 UPDATE
WHERE id IN (1001,1002,1003)
ERROR 1292:Truncated incorrect double/integer value这说明你在对数值类型字段赋了非法值,比如把字符串塞进 INT 列,或把超长小数塞进 DECIMAL(5,2)。MySQL 5.7+ 默认严格模式下会直接报错,老版本可能只警告并截断。
INSERT INTO products(price) VALUES('99.99 USD'); → 字符串含非数字字符,触发 ERROR 1292
SELECT CAST('99.99 USD' AS DECIMAL) 测试转换结果,MySQL 会返回 0.00 并产生 warningVARCHAR 存原始值、或在应用层做类型校验STR_TO_DATE() 解析失败也会报同类错误,例如 STR_TO_DATE('2025/13/01', '%Y/%m/%d')(13 月不存在)很多异常看起来“没报错”,但数据不对,根源常在事务控制混乱。尤其 ORM 或脚本中手动 BEGIN 后忘记 COMMIT 或 ROLLBACK。
SELECT @@autocommit;,0 表示关闭,需显
式 COMMIT
ROLLBACK,事务仍处于打开状态,后续语句可能被意外包含进去SELECT trx_state, trx_started, trx_query FROM information_schema.INNODB_TRX; 查看未提交事务BEGIN; INSERT ...; SELECT * FROM t;(查不到刚插的行)→ 说明还没提交,不是 SQL 问题,是事务卡住了SQL 报错本身只是表象,背后往往是数据状态、会话配置、权限边界或事务生命周期没理清。盯着错误码看两眼,再查一次 SHOW WARNINGS;,比重写十遍 SQL 更管用。