gpt4 book ai didi

mysql - 在查询中使用 * 时为 `You have an error in your SQL syntax;`

转载 作者:行者123 更新时间:2023-12-05 03:28:57 28 4
gpt4 key购买 nike

我有查询并且有效

select *, id, from_unixtime(start_timestamp) from log limit 1;

这也很好用:

select * from log limit 1;

为什么将 * 移动到末尾会出错?

select id, from_unixtime(start_timestamp), * from log limit 1;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '* from log limit 1' at line 1

最佳答案

原因是他们在 SQL 解析器中实现了一个快捷方式。

SQL-2003 规范显示了 SELECT 的语法规则如下:

<query specification> ::=
SELECT [ <set quantifier> ] <select list> <table expression>

<select list> ::=
<asterisk>
| <select sublist> [ { <comma> <select sublist> }... ]

<select sublist> ::=
<derived column>
| <qualified asterisk>

这表明SELECT *与以逗号分隔的列或限定星号的列表互斥。如果您使用不合格的 *那么那一定是整个选择列表。要实现这个语法,他们需要一个 <select list>规则和 <select sublist>规则。

但是MySQL的SQL parser Yacc file显示:

query_specification:
SELECT_SYM
select_options
select_item_list
...

select_item_list:
select_item_list ',' select_item
| select_item
| '*'

他们基本上合并了 <select list> 的规则和 <select sublist>成一个递归规则。所以他们对 select_item_list 的规则允许 SELECT *, <select_item>, <select_item>, ...而根据 SQL-2003 标准,它不应允许这样做。

由于语法上的这种捷径,他们不允许 *通配符成为 select_item_list 中的尾随项.

如果 MySQL 现在“修复”这个问题,使其符合标准语法规则,那无疑会破坏成千上万依赖于非标准语法的遗留应用程序。

您可以通过避免 SELECT *, ... 使您的代码符合标准语法句法。仅使用 SELECT * FROM ... .您也可以合法地使用限定星号,例如 SELECT t1.*, ... .

关于mysql - 在查询中使用 * 时为 `You have an error in your SQL syntax;`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71128839/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com