Ralat sintaks yang disebabkan oleh penggunaan perkataan simpanan sebagai nama jadual atau nama lajur dalam MySQL
P粉726234648
P粉726234648 2023-10-14 22:05:30
0
1
497

Saya cuba melaksanakan pertanyaan MySQL mudah seperti ini:

INSERT INTO user_details (username, location, key) VALUES ('Tim', 'Florida', 42)

Tetapi saya mendapat ralat berikut:

Ralat 1064 (42000): Anda mempunyai ralat dalam sintaks SQL anda; semak manual untuk versi pelayan MySQL anda untuk sintaks yang betul untuk digunakan berhampiran baris 1'key) VALUES ('Tim', 'Florida', 42)'

Bagaimana untuk menyelesaikan masalah ini?

P粉726234648
P粉726234648

membalas semua (1)
P粉545910687

Soalan

Dalam MySQL, beberapa perkataan sepertiSELECTINSERTDELETEadalah 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, dalam10.2 nama objek skema em>(penekanan ditambah):

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

  • Tambah
  • dan
  • sebelum
  • Pengarang
  • Panggil
  • KES
  • Syarat
  • Padamkan
  • Tempahan menurun
  • Penerangan
  • dari
  • Kumpulan
  • di
  • Indeks
  • Masukkan
  • Selang
  • Ya
  • Kunci
  • LIKE
  • Sekatan
  • PANJANG
  • Padankan
  • Tidak
  • Pilihan
  • atau
  • Pesan
  • Partition
  • Kedudukan
  • Rujukan
  • Pilih
  • JADUAL
  • Kepada
  • Kemas kini
  • Di mana

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 lain yang munasabah untuk lajur anda yang bukan perkataan simpanan.

Terdapat beberapa kelebihan untuk melakukan ini:

  • Ia menghapuskan kemungkinan anda atau pembangun lain bekerja dengan pangkalan data 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 membuat 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 (sebenarnya MySQL dalam mod ANSI SQL, seperti yang diterangkandi 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.

Semata-mata untuk mengurangkan risiko ralat masa hadapan, ini secara amnya merupakan pendekatan yang lebih bijak daripada pengecam tanda belakang.

2. Gunakan tanda belakang

Jika jadual atau lajur tidak boleh dinamakan semula, sertakan pengecam yang berkenaan dalam tanda belakang (`), seperti dalam10.2 Nama Objek Skemayang dipetik sebelum ini.

Contoh menunjukkan penggunaan (diambil daripada10.3 Kata Kunci dan Perkataan Terpelihara):

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

INSERT INTO user_details (username, location, `key`) VALUES ('Tim', 'Florida', 42)"; ^ ^
    Muat turun terkini
    Lagi>
    kesan web
    Kod sumber laman web
    Bahan laman web
    Templat hujung hadapan
    Tentang kita Penafian Sitemap
    Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!