TL;DR
Kesalahan #1064 berarti MySQL tidak dapat memahami perintah Anda. Untuk memperbaikinya:
Baca pesan kesalahan. Ini memberi tahu Anda di mana tepatnya dalam perintah Anda MySQL menjadi bingung.
Periksa perintah Anda. Jika Anda menggunakan bahasa pemrograman untuk membuat perintah, gunakan
echo
,console.log()
, atau yang setara untuk menampilkan seluruh perintah sehingga Anda dapat melihatnya.Periksa manualnya. Dengan membandingkan dengan apa yang harapkan MySQL pada saat itu , masalahnya sering terlihat jelas.
Periksa kata-kata yang dicadangkan. Jika kesalahan terjadi pada pengenal objek, periksa apakah itu bukan kata yang dicadangkan (dan, jika ya, pastikan bahwa itu dikutip dengan benar).
-
Aaaah!! Apa yang dimaksud dengan #1064 arti ?
Pesan kesalahan mungkin terlihat seperti gobbledygook, tetapi mereka (seringkali) sangat informatif dan memberikan detail yang cukup untuk menunjukkan dengan tepat apa yang salah. Dengan memahami dengan tepat apa yang dikatakan MySQL, Anda dapat mempersenjatai diri untuk memperbaiki masalah semacam ini di masa mendatang.
Seperti di banyak program, kesalahan MySQL dikodekan sesuai dengan jenis dari masalah yang terjadi. Kesalahan #1064 adalah kesalahan sintaks.
-
Apa "sintaks" yang Anda bicarakan ini? Apakah itu sihir?
Sementara "sintaksis" adalah kata yang hanya ditemui oleh banyak programmer dalam konteks komputer, itu sebenarnya dipinjam dari linguistik yang lebih luas. Ini mengacu pada struktur kalimat:yaitu aturan tata bahasa; atau, dengan kata lain, aturan yang mendefinisikan apa yang membentuk kalimat yang valid dalam bahasa.
Misalnya, kalimat bahasa Inggris berikut mengandung kesalahan sintaks (karena artikel tak tentu "a" harus selalu mendahului kata benda):
Kalimat ini mengandung kesalahan sintaks a.
-
Apa hubungannya dengan MySQL?
Setiap kali seseorang mengeluarkan perintah ke komputer, salah satu hal pertama yang harus dilakukan adalah "mengurai" perintah itu untuk memahaminya. "Kesalahan sintaksis" berarti bahwa pengurai tidak dapat memahami apa yang ditanyakan karena itu bukan merupakan perintah yang valid dalam bahasa tersebut:dengan kata lain, perintah tersebut melanggar tata bahasa bahasa pemrograman .
Penting untuk dicatat bahwa komputer harus memahami perintah sebelum dapat melakukan apa pun dengannya. Karena ada kesalahan sintaks, MySQL tidak tahu apa yang dicari dan karena itu menyerah bahkan sebelum melihat database dan oleh karena itu skema atau isi tabel tidak relevan.
-
-
Bagaimana cara memperbaikinya?
Jelas, kita perlu menentukan bagaimana perintah itu melanggar tata bahasa MySQL. Ini mungkin terdengar sangat sulit ditembus, tetapi MySQL berusaha sangat keras untuk membantu kami di sini. Yang perlu kita lakukan hanyalah…
-
Baca pesannya!
MySQL tidak hanya memberi tahu kita dengan tepat di mana parser mengalami kesalahan sintaks, tetapi juga membuat saran untuk memperbaikinya. Sebagai contoh, perhatikan perintah SQL berikut:
UPDATE my_table WHERE id=101 SET name='foo'
Perintah itu menghasilkan pesan kesalahan berikut:
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 memberi tahu kami bahwa semuanya tampak baik-baik saja hingga kata
WHERE
, tapi kemudian muncul masalah. Dengan kata lain, itu tidak mengharapkan untuk menemukanWHERE
pada saat itu.Pesan yang mengatakan
...near '' at line...
hanya berarti bahwa akhir perintah ditemukan secara tidak terduga:yaitu, sesuatu yang lain akan muncul sebelum perintah berakhir. -
Periksa teks sebenarnya dari perintah Anda!
Pemrogram sering membuat perintah SQL menggunakan bahasa pemrograman. Misalnya program php mungkin memiliki baris (salah) seperti ini:
$result = $mysqli->query("UPDATE " . $tablename ."SET name='foo' WHERE id=101");
Jika Anda menulis ini dalam dua baris
$query = "UPDATE " . $tablename ."SET name='foo' WHERE id=101" $result = $mysqli->query($query);
kemudian Anda dapat menambahkan
echo $query;
atauvar_dump($query)
untuk melihat bahwa kueri benar-benar mengatakanUPDATE userSET name='foo' WHERE id=101
Seringkali Anda akan segera melihat kesalahan Anda dan dapat memperbaikinya.
-
Taati perintah!
MySQL juga merekomendasikan agar kami "memeriksa manual yang sesuai dengan versi MySQL kami untuk sintaks yang tepat untuk digunakan ". Ayo lakukan itu.
Saya menggunakan MySQL v5.6, jadi saya akan membuka entri manual versi itu untuk
UPDATE
perintah . Hal pertama pada halaman adalah tata bahasa perintah (ini berlaku untuk setiap perintah):UPDATE [LOW_PRIORITY] [IGNORE] table_reference SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... [WHERE where_condition] [ORDER BY ...] [LIMIT row_count]
Manual menjelaskan cara menafsirkan sintaks ini di bawah Konvensi Tipografi dan Sintaks , tetapi untuk tujuan kita, cukup untuk mengenali bahwa:klausa yang ada di dalam tanda kurung siku
[
dan]
adalah opsional; batang vertikal|
menunjukkan alternatif; dan elips...
menunjukkan salah satu penghilangan untuk singkatnya, atau bahwa klausa sebelumnya dapat diulang.Kita sudah tahu bahwa parser percaya bahwa semua yang ada di perintah kita baik-baik saja sebelum
WHERE
kata kunci, atau dengan kata lain sampai dengan dan termasuk tabel referensi. Melihat tata bahasa, kita melihat bahwatable_reference
harus diikuti olehSET
kata kunci:sedangkan dalam perintah kami itu sebenarnya diikuti olehWHERE
kata kunci. Ini menjelaskan mengapa parser melaporkan bahwa ada masalah yang ditemukan pada saat itu.
Catatan reservasi
Tentu saja, ini adalah contoh sederhana. Namun, dengan mengikuti dua langkah yang diuraikan di atas (yaitu mengamati tepatnya di mana dalam perintah pengurai menemukan tata bahasa yang dilanggar dan membandingkannya dengan deskripsi manual tentang apa yang diharapkan pada saat itu ), hampir setiap kesalahan sintaks dapat dengan mudah diidentifikasi.
Saya katakan "hampir semua", karena ada kelas kecil masalah yang tidak begitu mudah dikenali—dan di situlah parser percaya bahwa elemen bahasa yang ditemui berarti satu hal sedangkan Anda bermaksud mengartikannya lain. Ambil contoh berikut:
UPDATE my_table SET where='foo'
Sekali lagi, pengurai tidak berharap menemukan
WHERE
pada titik ini dan seterusnya akan memunculkan kesalahan sintaksis yang serupa—tetapi Anda tidak bermaksud untuk ituwhere
menjadi kata kunci SQL:Anda bermaksud mengidentifikasi kolom untuk diperbarui! Namun, seperti yang didokumentasikan dalam Nama Objek Skema :Jika pengenal berisi karakter khusus atau kata khusus, Anda harus mengutipnya setiap kali Anda merujuknya. (Pengecualian:Kata khusus yang mengikuti tanda titik pada nama yang memenuhi syarat harus berupa pengenal, sehingga tidak perlu dikutip.) Kata yang dicadangkan tercantum di Bagian 9.3, “Kata Kunci dan Kata Cadangan” .
[ deletia ]
Karakter kutipan pengenal adalah backtick (“
`
”):mysql> SELECT * FROM `select` WHERE `select`.id > 100;
Jika
ANSI_QUOTES
Mode SQL diaktifkan, juga diizinkan untuk mengutip pengenal dalam tanda kutip ganda: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)
-