cari

Rumah  >  Soal Jawab  >  teks badan

Ralat sintaks MySQL: masalah yang disebabkan oleh penggunaan perkataan simpanan sebagai nama jadual atau lajur

<p>Saya cuba melaksanakan pertanyaan MySQL mudah berikut: </p> <pre class="brush:sql;toolbar:false;">MASUKKAN KE DALAM butiran_pengguna (nama pengguna, lokasi, kunci) NILAI ('Tim', 'Florida', 42) </pra> <p>Tetapi saya mendapat ralat berikut: </p> <blockquote> <p>RALAT 1064 (42000): Anda mempunyai ralat dalam sintaks SQL anda semak manual yang sepadan dengan versi pelayan MySQL anda untuk sintaks yang betul untuk digunakan berhampiran <kod>'kunci) NILAI ('Tim', '; Florida', 42)'</code> </blockquote> <p>Bagaimanakah saya hendak menyelesaikan masalah ini? </p>
P粉937769356P粉937769356468 hari yang lalu450

membalas semua(1)saya akan balas

  • P粉541796322

    P粉5417963222023-08-22 09:55:13

    Soalan

    Dalam MySQL, beberapa perkataan seperti SELECTINSERTDELETE adalah perkataan terpelihara. Oleh kerana ia mempunyai makna yang istimewa, MySQL menganggapnya sebagai ralat sintaks apabila anda menggunakannya sebagai nama jadual, nama lajur atau jenis pengecam lain - melainkan anda menyertakan pengecam dalam tanda belakang.

    Seperti yang dinyatakan dalam dokumentasi rasmi, dalam bahagian 10.2 Nama Objek Skema (penekanan ditambah):

    Senarai lengkap kata kunci dan perkataan terpelihara boleh didapati di Bahagian 10.3 Kata Kunci dan Perkataan Terpelihara . Dalam halaman ini, perkataan dengan "(R)" ialah perkataan terpelihara. Beberapa perkataan terpelihara disenaraikan di bawah, termasuk banyak yang boleh menyebabkan masalah ini.

    • TAMBAH
    • DAN
    • SEBELUM
    • OLEH
    • CALL
    • KES
    • KEADAAN
    • PADAM
    • DESC
    • HURAIKAN
    • DARI
    • KUMPULAN
    • DALAM
    • INDEX
    • MASUKKAN
    • SELANGA
    • IS
    • KUNCI
    • LIKE
    • TERHAD
    • PANJANG
    • PERLAWANAN
    • BUKAN
    • PILIHAN
    • ATAU
    • TEMPAHAN
    • PEMBAHAGIAN
    • KEDUDUKAN
    • RUJUKAN
    • PILIH
    • JADUAL
    • KEPADA
    • KEMASKINI
    • DIMANA

    Penyelesaian

    Anda ada dua pilihan.

    1. Jangan gunakan perkataan terpelihara sebagai pengecam

    Penyelesaian paling mudah adalah dengan mengelak daripada menggunakan perkataan yang dikhaskan sebagai pengecam. Anda mungkin boleh mencari nama lajur lain yang munasabah yang bukan perkataan simpanan.

    Terdapat beberapa kelebihan untuk melakukan ini:

    • Ia menghapuskan kemungkinan anda atau pembangun lain bekerja dengan pangkalan data anda secara tidak sengaja menulis ralat sintaks kerana mereka terlupa atau tidak tahu bahawa pengecam tertentu ialah perkataan yang dikhaskan. Terdapat banyak perkataan terpelihara dalam MySQL, dan tidak mungkin kebanyakan pembangun mengetahui kesemuanya. Dengan tidak menggunakan perkataan ini pada mulanya, anda mengelak daripada menetapkan perangkap untuk diri sendiri atau pembangun masa depan.

    • Cara pengecam dipetik berbeza antara dialek SQL. Walaupun MySQL menggunakan tanda belakang untuk memetik pengecam secara lalai, SQL yang mematuhi ANSI (dan MySQL dalam mod ANSI SQL, seperti yang diterangkan di sini) menggunakan petikan berganda untuk memetik pengecam. Oleh itu, pertanyaan yang menggunakan tanda belakang untuk memetik pengecam kurang mudah alih kepada dialek SQL yang lain.

    Untuk mengurangkan risiko kesilapan pada masa hadapan, ia selalunya lebih bijak daripada memetik pengecam dengan tanda belakang.

    2. Gunakan kutu belakang

    Jika jadual atau lajur tidak boleh dinamakan semula, sertakan dalam tanda tanda belakang () seperti yang diterangkan dalam 10.2 Nama Objek Skema ` yang dirujuk sebelum ini.

    Berikut ialah contoh menunjukkan penggunaan (diambil daripada 10.3 Kata Kunci dan Perkataan Terpelihara):

    Sekali lagi, pertanyaan dalam soalan boleh dibetulkan dengan membungkus kata kunci key dalam tanda belakang, seperti ini:

    INSERT INTO user_details (username, location, `key`)
    VALUES ('Tim', 'Florida', 42)";               ^   ^

    balas
    0
  • Batalbalas