How can I fix MySQL error #1064?

后端 未结 2 1257
难免孤独
难免孤独 2020-11-21 13:10

When issuing a command to MySQL, I\'m getting error #1064 \"syntax error\".

  1. What does it mean?

  2. How can I fix it?

相关标签:
2条回答
  • 2020-11-21 13:53

    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).

    1. Aaaagh!! What does #1064 mean?

      Error messages may look like gobbledygook, but they're (often) incredibly informative and provide sufficient detail to pinpoint what went wrong. By understanding exactly what MySQL is telling you, you can arm yourself to fix any problem of this sort in the future.

      As in many programs, MySQL errors are coded according to the type of problem that occurred. Error #1064 is a syntax error.

      • What is this "syntax" of which you speak? Is it witchcraft?

        Whilst "syntax" is a word that many programmers only encounter in the context of computers, it is in fact borrowed from wider linguistics. It refers to sentence structure: i.e. the rules of grammar; or, in other words, the rules that define what constitutes a valid sentence within the language.

        For example, the following English sentence contains a syntax error (because the indefinite article "a" must always precede a noun):

        This sentence contains syntax error a.

      • What does that have to do with MySQL?

        Whenever one issues a command to a computer, one of the very first things that it must do is "parse" that command in order to make sense of it. A "syntax error" means that the parser is unable to understand what is being asked because it does not constitute a valid command within the language: in other words, the command violates the grammar of the programming language.

        It's important to note that the computer must understand the command before it can do anything with it. Because there is a syntax error, MySQL has no idea what one is after and therefore gives up before it even looks at the database and therefore the schema or table contents are not relevant.

    2. How do I fix it?

      Obviously, one needs to determine how it is that the command violates MySQL's grammar. This may sound pretty impenetrable, but MySQL is trying really hard to help us here. All we need to do is…

      • Read the message!

        MySQL not only tells us exactly where the parser encountered the syntax error, but also makes a suggestion for fixing it. For example, consider the following SQL command:

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

        That command yields the following error message:

        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 is telling us that everything seemed fine up to the word WHERE, but then a problem was encountered. In other words, it wasn't expecting to encounter WHERE at that point.

        Messages that say ...near '' at line... simply mean that the end of command was encountered unexpectedly: that is, something else should appear before the command ends.

      • Examine the actual text of your command!

        Programmers often create SQL commands using a programming language. For example a php program might have a (wrong) line like this:

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

        If you write this this in two lines

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

        then you can add echo $query; or var_dump($query) to see that the query actually says

        UPDATE userSET name='foo' WHERE id=101
        

        Often you'll see your error immediately and be able to fix it.

      • Obey orders!

        MySQL is also recommending that we "check the manual that corresponds to our MySQL version for the right syntax to use". Let's do that.

        I'm using MySQL v5.6, so I'll turn to that version's manual entry for an UPDATE command. The very first thing on the page is the command's grammar (this is true for every command):

        UPDATE [LOW_PRIORITY] [IGNORE] table_reference
            SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
            [WHERE where_condition]
            [ORDER BY ...]
            [LIMIT row_count]
        

        The manual explains how to interpret this syntax under Typographical and Syntax Conventions, but for our purposes it's enough to recognise that: clauses contained within square brackets [ and ] are optional; vertical bars | indicate alternatives; and ellipses ... denote either an omission for brevity, or that the preceding clause may be repeated.

        We already know that the parser believed everything in our command was okay prior to the WHERE keyword, or in other words up to and including the table reference. Looking at the grammar, we see that table_reference must be followed by the SET keyword: whereas in our command it was actually followed by the WHERE keyword. This explains why the parser reports that a problem was encountered at that point.

      A note of reservation

      Of course, this was a simple example. However, by following the two steps outlined above (i.e. observing exactly where in the command the parser found the grammar to be violated and comparing against the manual's description of what was expected at that point), virtually every syntax error can be readily identified.

      I say "virtually all", because there's a small class of problems that aren't quite so easy to spot—and that is where the parser believes that the language element encountered means one thing whereas you intend it to mean another. Take the following example:

      UPDATE my_table SET where='foo'
      

      Again, the parser does not expect to encounter WHERE at this point and so will raise a similar syntax error—but you hadn't intended for that where to be an SQL keyword: you had intended for it to identify a column for updating! However, as documented under 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 Section 9.3, “Keywords and Reserved Words”.

      [ deletia ]

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

      mysql> SELECT * FROM `select` WHERE `select`.id > 100;

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

      mysql> CREATE TABLE "test" (col INT);
      ERROR 1064: You have an error in your SQL syntax...
      mysql> SET sql_mode='ANSI_QUOTES';
      mysql> CREATE TABLE "test" (col INT);
      Query OK, 0 rows affected (0.00 sec)

    0 讨论(0)
  • 2020-11-21 14:03

    For my case, I was trying to execute procedure code in MySQL, and due to some issue with server in which Server can't figure out where to end the statement I was getting Error Code 1064. So I wrapped the procedure with custom DELIMITER and it worked fine.

    For example, Before it was:

    DROP PROCEDURE IF EXISTS getStats;
    CREATE PROCEDURE `getStats` (param_id INT, param_offset INT, param_startDate datetime, param_endDate datetime)
    BEGIN
        /*Procedure Code Here*/
    END;
    

    After putting DELIMITER it was like this:

    DROP PROCEDURE IF EXISTS getStats;
    DELIMITER $$
    CREATE PROCEDURE `getStats` (param_id INT, param_offset INT, param_startDate datetime, param_endDate datetime)
    BEGIN
        /*Procedure Code Here*/
    END;
    $$
    DELIMITER ;
    
    0 讨论(0)
提交回复
热议问题