天天看點

mysql 1064錯誤修複_如何修複MySQL錯誤#1064?

TL;DR

Error #1064 means that MySQL can’t understand your command. To fix it:

Read the error message. It tells you exactly where in your command MySQL got confused.

Examine your command. If you use a programming language to create your command, use echo, console.log(), or its equivalent to show the entire command so you can see it.

Check the manual. By comparing against what MySQL expected at that point, the problem is often obvious.

Check for reserved words. If the error occurred on an object identifier, check that it isn’t a reserved word (and, if it is, ensure that it’s properly quoted).

> Aaaagh !! #1064是什麼意思?

錯誤消息可能看起來像gobbledygook,但它們(通常)提供了令人難以置信的資訊,并提供足夠的細節來查明出錯的地方.通過準确了解MySQL告訴你的内容,你可以在未來武裝自己解決這類問題.

與許多程式一樣,MySQL錯誤根據發生的問題類型進行編碼. Error #1064是文法錯誤.

>你說的這個“文法”是什麼?這是巫術嗎?

雖然“文法”是許多程式員隻在計算機環境中遇到的一個詞,但它實際上是從更廣泛的語言學中借用的.它指的是句子結構:即文法規則;或者換句話說,定義什麼構成語言中的有效句子的規則.

例如,以下英語句子包含文法錯誤(因為不定冠詞“a”必須始終位于名詞之前):

This sentence contains syntax error a.

>這與MySQL有什麼關系?

每當向計算機發出指令時,它必須做的第一件事就是“解析”該指令以便了解它. “文法錯誤”意味着解析器無法了解所請求的内容,因為它不構成語言中的有效指令:換句話說,該指令違反了程式設計語言的文法.

重要的是要注意,計算機必須先了解該指令才能對其執行任何操作.因為存在文法錯誤,是以MySQL不知道後者是什麼,是以在它甚至檢視資料庫之前放棄,是以架構或表内容不相關.

>我該如何解決?

顯然,需要确定指令違反MySQL文法的方式.這可能聽起來非常難以了解,但MySQL正在努力幫助我們.我們需要做的就是……

>閱讀消息!

MySQL不僅告訴我們解析器遇到文法錯誤的确切位置,還提出修複它的建議.例如,請考慮以下SQL指令:

UPDATE my_table WHERE id=101 SET name='foo'

該指令産生以下錯誤消息:

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 'WHERE id=101 SET name='foo'' at line 1

MySQL告訴我們一切似乎都很好,直到單詞WHERE,但遇到了問題.換句話說,它并不期望在那時遇到WHERE.

說’線上’附近的消息…隻是意味着意外地遇到了指令的結束:也就是說,在指令結束之前應該出現其他東西.

>檢查指令的實際文本!

程式員經常使用程式設計語言建立SQL指令.例如,php程式可能有一個(錯誤的)行,如下所示:

$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");

如果你用兩行寫這個

$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101"

$result = $mysqli->query($query);

然後你可以添加echo $query;或者var_dump($query)檢視查詢實際上是什麼

UPDATE userSET name='foo' WHERE id=101

通常,您會立即看到錯誤并能夠修複它.

>服從訂單!

MySQL還建議我們“檢查與我們的MySQL版本相對應的手冊,以便使用正确的文法”.我們這樣做.

我正在使用MySQL v5.6,是以我将轉向that version’s manual entry for an UPDATE command.頁面上的第一件事就是指令的文法(對于每個指令都是如此):

UPDATE [LOW_PRIORITY] [IGNORE] table_reference

SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...

[WHERE where_condition]

[ORDER BY ...]

[LIMIT row_count]

該手冊解釋了如何在Typographical and Syntax Conventions下解釋這種文法,但出于我們的目的,它足以認識到:方括号[和]中包含的子句是可選的;豎條|表明替代品;和省略号……表示為了簡潔而省略,或者可以重複前面的條款.

我們已經知道解析器認為我們指令中的所有内容在WHERE關鍵字之前都是正常的,或者換句話說直到并包括表引用.檢視文法,我們看到table_reference必須後跟SET關鍵字:而在我們的指令中,實際上後面跟着WHERE關鍵字.這解釋了解析器報告此時遇到問題的原因.

保留說明

當然,這是一個簡單的例子.然而,通過遵循上面概述的兩個步驟(即,在指令中确切地觀察解析器發現文法被違反的位置并且與手冊對該點的預期描述進行比較),實際上可以容易地識别每個文法錯誤.

我說“幾乎所有”,因為有一小部分問題不太容易被發現 – 而且解析器認為遇到的語言元素意味着一件事,而你打算意味着另一件事.請看以下示例:

UPDATE my_table SET where='foo'

同樣,解析器不期望在此時遇到WHERE,是以會引發類似的文法錯誤 – 但您并不打算将其作為SQL關鍵字的位置:您原本打算用它來辨別要更新的列!但是,如Schema Object Names所述:

If an identifier contains special characters or is a reserved word, you must quote it whenever you refer to it. (Exception: A reserved word that follows a period in a qualified name must be an identifier, so it need not be quoted.) Reserved words are listed at 07004.

06006

The identifier quote character is the backtick (“`”):

06007

If the 07005 SQL mode is enabled, it is also permissible to quote identifiers within double quotation marks:

06008