TL; DR
Lỗi # 1064 có nghĩa là MySQL không thể hiểu lệnh của bạn. Để khắc phục:
Đọc thông báo lỗi. Nó cho bạn biết chính xác vị trí trong lệnh của bạn MySQL bị nhầm lẫn.
Kiểm tra lệnh của bạn. Nếu bạn sử dụng ngôn ngữ lập trình để tạo lệnh của mình, hãy sử dụng
echo
,console.log()
hoặc tương đương để hiển thị toàn bộ lệnh để bạn có thể nhìn thấy nó.Kiểm tra hướng dẫn sử dụng. Bằng cách so sánh với những gì MySQL mong đợi tại thời điểm đó , vấn đề thường rõ ràng.
Kiểm tra các từ dành riêng. Nếu lỗi xảy ra trên số nhận dạng đối tượng, hãy kiểm tra xem đó có phải là từ dành riêng không (và nếu có, hãy đảm bảo rằng nó được trích dẫn chính xác).
-
Aaaagh !! # 1064 nghĩa là gì ?
Thông báo lỗi có thể trông như gobbledygook, nhưng chúng (thường) cực kỳ nhiều thông tin và cung cấp đầy đủ chi tiết để xác định điều gì đã xảy ra. Bằng cách hiểu chính xác những gì MySQL đang nói với bạn, bạn có thể tự khắc phục bất kỳ sự cố nào thuộc loại này trong tương lai.
Như trong nhiều chương trình, lỗi MySQL được mã hóa theo loại của sự cố đã xảy ra. Lỗi # 1064 là một lỗi cú pháp.
-
Bạn nói "cú pháp" này là gì? Nó có phải là phù thủy không?
Trong khi "cú pháp" là một từ mà nhiều lập trình viên chỉ gặp trong ngữ cảnh của máy tính, nhưng trên thực tế, nó được vay mượn từ ngôn ngữ học rộng lớn hơn. Nó đề cập đến cấu trúc câu:tức là các quy tắc của ngữ pháp ; hoặc nói cách khác, các quy tắc xác định những gì cấu thành một câu hợp lệ trong ngôn ngữ.
Ví dụ, câu tiếng Anh sau có lỗi cú pháp (vì mạo từ không xác định "a" phải luôn đứng trước danh từ):
Câu này có lỗi cú pháp a.
-
Điều đó có liên quan gì với MySQL?
Bất cứ khi nào một lệnh cho máy tính, một trong những điều đầu tiên mà nó phải làm là "phân tích cú pháp" lệnh đó để hiểu nó. "Lỗi cú pháp" có nghĩa là trình phân tích cú pháp không thể hiểu những gì đang được hỏi vì nó không tạo thành một lệnh hợp lệ trong ngôn ngữ:nói cách khác, lệnh vi phạm ngữ pháp của ngôn ngữ lập trình .
Điều quan trọng cần lưu ý là máy tính phải hiểu lệnh trước khi nó có thể làm bất cứ điều gì với nó. Bởi vì có lỗi cú pháp, MySQL không biết cái gì đang theo sau và do đó bỏ cuộc trước khi nó xem xét cơ sở dữ liệu và do đó lược đồ hoặc nội dung bảng không liên quan.
-
-
Làm cách nào để khắc phục sự cố này?
Rõ ràng, người ta cần xác định xem lệnh đó vi phạm ngữ pháp của MySQL như thế nào. Điều này nghe có vẻ khá bất khả thi, nhưng MySQL đang thực sự cố gắng để giúp chúng ta ở đây. Tất cả những gì chúng ta cần làm là…
-
Đọc tin nhắn!
MySQL không chỉ cho chúng ta biết chính xác nơi trình phân tích cú pháp gặp lỗi cú pháp, nhưng cũng đưa ra đề xuất để sửa lỗi đó. Ví dụ:hãy xem xét lệnh SQL sau:
UPDATE my_table WHERE id=101 SET name='foo'
Lệnh đó mang lại thông báo lỗi sau:
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 nói với chúng tôi rằng mọi thứ dường như tốt cho đến từ
WHERE
, nhưng sau đó một vấn đề đã gặp phải. Nói cách khác, nó không mong đợi gặp phảiWHERE
tại thời điểm đó.Tin nhắn có nội dung
...near '' at line...
đơn giản có nghĩa là phần cuối của lệnh đã được gặp phải một cách bất ngờ:nghĩa là, một cái gì đó khác sẽ xuất hiện trước khi lệnh kết thúc. -
Kiểm tra văn bản thực tế của lệnh của bạn!
Các lập trình viên thường tạo các lệnh SQL bằng một ngôn ngữ lập trình. Ví dụ:một chương trình php có thể có một dòng (sai) như thế này:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
Nếu bạn viết điều này trong hai dòng
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
thì bạn có thể thêm
echo $query;
hoặcvar_dump($query)
để thấy rằng truy vấn thực sự nóiUPDATE userSET name='foo' WHERE id=101
Thường thì bạn sẽ thấy lỗi của mình ngay lập tức và có thể sửa nó.
-
Tuân lệnh!
MySQL cũng khuyên chúng tôi nên " kiểm tra hướng dẫn sử dụng tương ứng với phiên bản MySQL của chúng tôi để biết cú pháp phù hợp để sử dụng ". Hãy làm điều đó.
Tôi đang sử dụng MySQL v5.6, vì vậy tôi sẽ chuyển sang mục nhập thủ công của phiên bản đó cho một
UPDATE
lệnh . Điều đầu tiên trên trang là ngữ pháp của lệnh (điều này đúng với mọi lệnh):UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
Hướng dẫn giải thích cách diễn giải cú pháp này theo Quy ước về kiểu chữ và cú pháp , nhưng đối với mục đích của chúng tôi, đủ để nhận ra rằng:các mệnh đề nằm trong dấu ngoặc vuông
[
và]
là tùy chọn; thanh dọc|
chỉ ra các lựa chọn thay thế; và dấu chấm lửng...
biểu thị sự thiếu sót cho ngắn gọn hoặc mệnh đề trước đó có thể được lặp lại.Chúng tôi đã biết rằng trình phân tích cú pháp tin rằng mọi thứ trong lệnh của chúng tôi đều ổn trước
WHERE
từ khóa, hay nói cách khác lên đến và bao gồm cả tham chiếu bảng. Nhìn vào ngữ pháp, chúng ta thấy rằngtable_reference
phải được theo sau bởiSET
keyword:trong khi trong lệnh của chúng tôi, nó thực sự được theo sau bởiWHERE
từ khóa. Điều này giải thích tại sao trình phân tích cú pháp báo cáo rằng đã gặp sự cố tại thời điểm đó.
Lưu ý đặt chỗ
Tất nhiên, đây là một ví dụ đơn giản. Tuy nhiên, bằng cách làm theo hai bước nêu trên (nghĩa là quan sát chính xác vị trí trong lệnh trình phân tích cú pháp nhận thấy ngữ pháp bị vi phạm và so sánh với mô tả của sách hướng dẫn về điều được mong đợi tại thời điểm đó ), hầu như mọi lỗi cú pháp đều có thể được xác định một cách dễ dàng.
Tôi nói "hầu như tất cả", bởi vì có một nhóm vấn đề nhỏ không quá dễ phát hiện — và đó là nơi mà trình phân tích cú pháp tin rằng yếu tố ngôn ngữ gặp phải có nghĩa là một thứ trong khi bạn dự định nó có nghĩa là một thứ khác. Lấy ví dụ sau:
UPDATE my_table SET where='foo'
Một lần nữa, trình phân tích cú pháp không mong đợi gặp phải
WHERE
tại thời điểm này và do đó sẽ phát sinh lỗi cú pháp tương tự — nhưng bạn không có ý định đówhere
là một từ khóa SQL:bạn đã có ý định để nó xác định một cột để cập nhật! Tuy nhiên, như được ghi lại trong Tên đối tượng giản đồ :Nếu số nhận dạng chứa các ký tự đặc biệt hoặc là một từ dành riêng, bạn phải trích dẫn nó bất cứ khi nào bạn tham khảo nó. (Ngoại lệ:Từ dành riêng đứng sau dấu chấm trong tên đủ điều kiện phải là số nhận dạng, vì vậy nó không cần được trích dẫn.) Các từ dành riêng được liệt kê tại Phần 9.3, “Từ khóa và từ dành riêng” .
[ deletia ]
Ký tự trích dẫn của mã định danh là biểu tượng nền (“
`
”):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Nếu
ANSI_QUOTES
Chế độ SQL được bật, nó cũng được phép trích dẫn số nhận dạng trong dấu ngoặc kép: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)
-