我对SQL很陌生,我发现了类似的问题,但是我进行了建议的更改,但仍然收到相同的错误。任何人都可以提示我正确的方向,为什么我仍然会收到此错误?
任何建议或帮助将不胜感激。谢谢。
mysql> USE famous_scientists;
Database changed
-> CREATE TABLE scientists (
-> id INT(1) NOT NULL auto_increment,
-> name VARCHAR(255) NOT NULL,
-> discovery VARCHAR(255) NOT NULL,
-> year_of_birth INT(4) NOT NULL,
-> year_of_death INT(4) NULL,
-> PRIMARY KEY (id)
-> ) AUTO_INCREMENT=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 '
CREATE TABLE scientists (
id INT(1) NOT NULL auto_increment,
name V' at line 1
你的代码工作正常。 请参阅 SQL 小提琴。
如果您有错误,则很可能位于此代码之上。 错误消息指出无法识别create
。 有时坏角色会悄悄潜入。
尝试:
mysql> USE famous_scientists;
Database changed
CREATE TABLE scientists (
id INT NOT NULL auto_increment,
name VARCHAR(255) NOT NULL,
discovery VARCHAR(255) NOT NULL,
year_of_birth INT(4) NOT NULL,
year_of_death INT(4) NULL,
PRIMARY KEY (id)
) AUTO_INCREMENT=1;
CREATE TABLE scientists (
id INT NOT NULL auto_increment,
name VARCHAR(255) NOT NULL,
discovery VARCHAR(255) NOT NULL,
year_of_birth INT(4) NOT NULL,
year_of_death INT(4) NULL,
PRIMARY KEY (id)
)
mysql> USE famous_scientists;
Database changed
->
这个^^^^箭头是错误的。 它不应该在这里。
您应该看到以下内容:
mysql> USE famous_scientists;
Database changed
mysql>
事实上,您没有表明您正在输入或粘贴的数据发生了奇怪的事情。 这不是真正的语法错误,只是公然的混乱。
->
箭头表示 CLI 认为您已经在键入或粘贴 SQL 语句,而您显然不打算这样做。
接下来要做的适当事情是 Control-C 并重新开始。
错误消息本身很常见 - 任何类型的语法错误都会触发它,但是如果您确切地内化它的含义,您将节省很多精神痛苦。 这似乎很神秘,但实际上并非如此。
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 '...'
单词near
后面的单引号内的任何内容都是发生错误时尚未分析的查询部分。
换句话说,您看到的是确切位置的开头- 从左到右 - 查询停止对服务器具有语法意义。
重要的是,报告的特定错误永远不会晚于带引号的字符串的开头。 它也不太可能在查询之前,因为查询中此位置之前的任何内容,服务器都认为在语法上是有效的。 查询前面可能有一个错误,该错误未按预期执行,但从服务器的角度来看,这不是语法错误。
例子:
mysql> SELECT * * FROM t1;
ERROR 1064 (42000): ...right syntax to use near '* FROM t1' at line 1
第二个*
是使它感到困惑的原因。 之后的内容无关紧要,因为第二个*
在语法上是无效的。
mysql> SELECT * FROM FROM t1;
ERROR 1064 (42000): ...right syntax to use near 'FROM t1' at line 1
同样的事情...第二个FROM
无效。 解析到此为止,因为它没有意义。
假设我想放一张桌子,但我忘记输入单词DROP
.
mysql> TABLE t1;
ERROR 1064 (42000): ...right syntax to use near 'TABLE t1' at line 1
服务器说"等等,你不能用关键字TABLE
启动查询。 查询中的第一件事是错误的。
另请注意,我实际上没有一个名为t1
的表,但服务器还没有达到检查这一点的程度。 遇到的第一个意想不到的事情是停止该过程的原因。
这个例子就像你的一样...服务器似乎在抱怨查询的开头......因此,目前完全没有必要更深入地研究您的查询。
所以这个错误...
...the right syntax to use near '
CREATE TABLE scientists (
。立即告诉您服务器被CREATE
或某些控制字符或看起来像空格的内容弄糊涂了。 但问题不在以后。CREATE
之后尚未评估任何内容。
这怎么可能? 你是对的,这不是...除非在那之前有什么东西被输入了...我们知道情况确实如此,因为->
提示。 它是什么或它究竟是如何到达那里的,无法推测。
最后一个例子,也是这个最令人困惑的例子......但是一旦您了解了上述所有内容,它就有意义了。
mysql> SELECT * FROM user WHERE;
ERROR 1064 (42000): ...right syntax to use near '' at line 1
等等,什么?near ''
是什么意思?
还记得引号中以混淆服务器的第一件事开头的部分吗? 在这种情况下,让服务器感到困惑的是,它已经解析了所有内容,一直到我的查询结束,并发现我的查询毫无意义。 它很困惑,因为在解释我的查询时,它需要更多,但它没有找到更多。 然而,我的查询不可能是完整的,因为我没有在WHERE
之后放任何东西。 所以near ''
意味着在一切结束之后。 解析器(或者可能是词法分析器,我跑题了)已经没有要检查的东西了,但目前的查询不完整,所以错误"接近"......无。 它接近查询结束时未解析的任何内容。
如果您的查询实际上存在任何问题,则此错误不会告诉您。 它基本上根本没有被解析。
但是现在您知道如何在面对ERROR 1064 (42000)
并试图弄清楚服务器试图告诉您的内容时"像MySQL一样思考"。