mysql 查询报错

Expression #1 of ORDER BY clause is not in SELECT list, references column 'X1.t0.name' which is not in SELECT list; this is incompatible with DISTINCT

这一般是mysql版本问题造成的。

临时解决:

select version();
select @@global.sql_mode   查询sql_mode
set global sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

永久解决:
修改my.cnf,去掉ONLY_FULL_GROUP_BY参数:
添加sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

数据库表字段字符集不同的查询报错,首先查看创建表的sql,或者看表结构的字符集是什么样子,然后修改一致,

ALTER table table_name COLLATE=utf8mb4_general_ci, convert to CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

<think>嗯,用户这次明确提出了关于MySQL错误1064的解决方案需求。从引用内容看,用户之前可能遇到了SQL语法错误问题,特别是引用[1]和引用[3]都提到了1064错误,引用[3]还提到用户尝试添加列时遇到了这个错误。 用户应该是个开发者或数据库管理员,正在调试SQL语句。这个错误很常见但可能让用户感到挫败,因为错误信息有时不够明确。需要帮用户系统性地解决这个问题。 首先考虑错误1064的本质:这是SQL语法错误。MySQL无法解析用户输入的语句。可能原因包括: - 关键字拼写错误,比如SELECR - 缺少逗号/括号不匹配 - 保留字未转义 - 数据类型错误 准备分步骤说明解决方案: 1. 先教用户如何精准定位错误位置(错误信息中的行号定位) 2. 常见错误类型要分类说明(保留字、数据类型、符号缺失等) 3. 给出具体示例对比错误和正确写法 4. 特别强调用户案例中可能遇到的保留字问题(如引用[3]的varchar字段问题) 5. 提供进阶调试工具(如EXPLAIN) 注意到引用[3]提到用户可能在操作varchar字段时报错,这很可能是未转义保留字导致的。比如用户可能写了: ALTER TABLE test ADD COLUMN desc varchar(255) 而"desc"是保留字,应该用反引号包裹。 在解决方案中要重点强调保留字问题,并给出完整示例。同时提醒用户注意MySQL版本差异,不同版本保留字可能不同。 最后考虑用户可能的后续问题,准备相关提问: - 如何避免常见语法错误(预防措施) - 其他类似错误代码(如用户引用过的2002错误) - 表维护时的注意事项(因引用[4]提到表锁定问题) 这样既能解决当前问题,又能引导用户系统学习MySQL错误处理。</think>MySQL错误1064表示SQL语法错误,通常由以下原因导致。请按步骤排查: ### 🔍 错误原因及解决方案 1. **SQL关键字拼写错误** ```sql SELECR * FROM users; -- 错误拼写(SELECT) ``` ✅ 修正:检查并修正拼写错误。 2. **保留字未转义** 使用MySQL保留字(如`order`, `desc`, `group`)作为列名/表名时需用反引号包裹: ```sql CREATE TABLE test (group varchar(10)); -- 错误 ``` ✅ 修正: ```sql CREATE TABLE test (`group` varchar(10)); -- 正确 ``` 3. **数据类型或符号错误** - 缺失逗号/括号不匹配: ```sql CREATE TABLE users (id INT, name VARCHAR(20) age INT); -- 缺少逗号 ``` - 错误的数据类型: ```sql INSERT INTO users (join_date) VALUES (&#39;2024-02-30&#39;); -- 无效日期 ``` 4. **特殊字符处理不当** 字符串中的引号需转义: ```sql INSERT INTO posts (content) VALUES (&#39;It&#39;s a test&#39;); -- 错误 ``` ✅ 修正: ```sql INSERT INTO posts (content) VALUES (&#39;It\&#39;s a test&#39;); -- 单引号转义 ``` 5. **过时语法** MySQL 8.0+移除部分旧语法,如: ```sql GRANT ALL PRIVILEGES ON *.* TO &#39;user&#39;@&#39;host&#39; IDENTIFIED BY &#39;password&#39;; -- 已废弃 ``` ✅ 修正(分两步执行): ```sql CREATE USER &#39;user&#39;@&#39;host&#39; IDENTIFIED BY &#39;password&#39;; GRANT ALL PRIVILEGES ON *.* TO &#39;user&#39;@&#39;host&#39;; ``` ### 🛠️ 通用排查流程 1. **定位错误行** 查看错误提示中的行号(如 `near &#39;...&#39; at line 1`),优先检查该位置前后的语法。 2. **简化SQL语句** 将复杂查询拆分成多个子查询逐步验证。 3. **验证保留字** 检查表名、列名是否与[MySQL保留字列表](https://dev.mysql.com/doc/refman/8.0/en/keywords.html)冲突。 4. **使用官方工具** 用MySQL Workbench或`EXPLAIN`命令辅助调试: ```sql EXPLAIN SELECT * FROM users WHERE id=1; -- 分析查询结构 ``` 5. **版本兼容性检查** 确认使用的语法与MySQL版本匹配(如`WITH`语句需5.7+)。 > 案例:用户添加列时报错1064[^3],通常因保留字未转义或数据类型错误引起: > ```sql > ALTER TABLE products ADD desc TEXT; -- 错误(desc是保留字) > ``` > ✅ 修正: > ```sql > ALTER TABLE products ADD `desc` TEXT; -- 正确 > ``` ### 💡 预防建议 - 用反引号包裹所有标识符:`` `column_name` `` - 避免使用保留字命名 - 在测试环境验证SQL后再上线 - 使用ORM框架自动处理语法问题 --- ### 📚 相关问题 1. **如何快速定位MySQL语法错误的具体位置?** 2. **MySQL 8.0与5.7版本有哪些不兼容的语法变更?** 3. **使用ORM框架时如何调试生成的SQL语句?** 4. **除了1064,哪些常见MySQL错误与权限配置相关?(如ERROR 1045, 1142)** 5. **如何批量检查SQL脚本中的语法错误?** > 引用说明:错误案例参考了用户提供的1064报错信息[^1][^3],其中涉及保留字和语法结构问题。版本兼容性问题参考了MySQL官方文档的语法变更说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值