Lebih
Kapan harus menggunakan tanda kutip tunggal, tanda kutip ganda, dan backticks di MySQL
Saya mencoba untuk belajar cara terbaik untuk menulis pertanyaan. Saya juga memahami pentingnya bersikap konsisten. Sampai sekarang, saya telah digunakan secara acak single quote, double quote, dan backticks tanpa pemikiran yang nyata.
Contoh:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Juga, dalam contoh di atas, menganggap bahwa meja
, col1
, val1
, dll. mungkin variabel.
Apa standar untuk ini? Apa yang anda lakukan?
I've telah membaca jawaban untuk pertanyaan-pertanyaan serupa di sini selama sekitar 20 menit, tapi sepertinya tidak ada jawaban pasti untuk pertanyaan ini.
602
12
Backticks yang akan digunakan untuk tabel dan kolom pengidentifikasi, tetapi hanya diperlukan ketika identifier adalah MySQL reserved kata kunci, atau ketika pengenal berisi karakter spasi atau karakter melampaui satu set terbatas (lihat di bawah) Hal ini sering dianjurkan untuk menghindari menggunakan kata kunci yang dicadangkan sebagai kolom atau tabel pengenal bila mungkin, menghindari mengutip masalah.
Tanda kutip tunggal harus digunakan untuk nilai-nilai string seperti di
VALUES()
daftar. Tanda kutip ganda yang didukung oleh MySQL untuk nilai string juga, tapi tanda kutip tunggal yang lebih banyak diterima oleh RDBMS lain, jadi ini adalah kebiasaan yang baik untuk menggunakan tanda kutip tunggal, bukan dua.MySQL juga mengharapkan
DATE
danDATETIME
nilai literal untuk menjadi satu-dikutip string seperti'2001-01-01 00:00:00'
. Konsultasikan Tanggal dan Waktu Literal dokumentasi untuk lebih jelasnya, khususnya alternatif untuk menggunakan tanda hubung-
sebagai segmen pembatas di upload string.Jadi dengan menggunakan contoh, saya akan kutip ganda PHP string dan menggunakan tanda kutip tunggal pada nilai-nilai
'val1', 'val2'
.NULL
adalah kata kunci MySQL, dan khusus (non)-nilai, dan karena itu tidak dikuotasi.Tidak satupun dari tabel atau kolom pengidentifikasi kata-kata dicadangkan atau menggunakan karakter yang memerlukan mengutip, tapi aku've dikutip mereka pula dengan backticks (lebih lanjut tentang ini nanti).
Fungsi asli RDBMS (misalnya,
NOW()
di MySQL) tidak boleh dikutip, meskipun argumen mereka adalah subjek untuk string yang sama atau pengenal mengutip aturan-aturan yang telah disebutkan.Variabel interpolasi
Mengutip pola untuk variabel tidak berubah, meskipun jika anda berniat untuk melakukan interpolasi variabel langsung dalam sebuah string, maka harus double-dikutip dalam PHP. Hanya pastikan bahwa anda telah benar-benar lolos dari variabel-variabel yang digunakan dalam SQL. (Dianjurkan untuk menggunakan API yang mendukung pernyataan siap sebaliknya, sebagai perlindungan terhadap SQL injection).
Pernyataan siap
Ketika bekerja dengan pernyataan siap, konsultasikan dokumentasi untuk menentukan apakah atau tidak pernyataan's penampung harus dikutip. Yang paling populer Api tersedia di PHP, PDO dan MySQLi, mengharapkan unquoted penampung, seperti yang dilakukan kebanyakan pernyataan yang disiapkan Api dalam bahasa lain:
Karakter requring backtick mengutip dalam pengidentifikasi:
Menurut dokumentasi MySQL, anda tidak perlu quote (backtick) pengidentifikasi berikut menggunakan set karakter:
Anda dapat menggunakan karakter luar yang ditetapkan sebagai tabel atau kolom pengidentifikasi, termasuk spasi misalnya, tapi kemudian anda must kutipan (backtick) mereka.
Ada dua jenis kutipan di MySQL:
'
untuk melampirkan string literals`
untuk melampirkan pengenal seperti tabel dan nama kolomDan kemudian ada
"
yang merupakan kasus khusus. Itu bisa digunakan untuk one dari yang disebutkan di atas tujuan-tujuan di waktu tergantung pada MySQL server'ssql_mode
:"
karakter yang dapat digunakan untuk melampirkan string literals hanya suka'
ANSI_QUOTES
mode"
karakter yang dapat digunakan untuk melampirkan pengenal seperti`
Query berikut ini akan menghasilkan hasil yang berbeda (atau kesalahan) tergantung pada mode SQL:
ANSI_QUOTES dinonaktifkan
Permintaan akan pilih string literal
"kolom"
dimana kolomfoo
sama dengan string"bar"
ANSI_QUOTES diaktifkan
Permintaan akan pilih kolom
kolom
di mana kolomfoo
adalah sama dengan kolombar
Ketika menggunakan apa
"
sehingga kode anda menjadi independen dari SQL mode(Ada jawaban yang baik atas mengenai SQL sifat dari pertanyaan anda, tapi ini juga mungkin relevan jika anda baru untuk PHP.)
Mungkin hal ini penting untuk menyebutkan bahwa PHP menangani single dan double quoted string berbeda...
Single-quoted string 'literal' dan cukup banyak WYSIWYG string. Double-quoted string yang ditafsirkan oleh PHP untuk kemungkinan variabel-substitusi (backticks di PHP tidak persis string; mereka mengeksekusi perintah di shell dan pengembalian hasil).
Contoh:
Backticks umumnya digunakan untuk menunjukkan
identifier
dan juga menjadi aman sengaja menggunakan kata Kunci cadangan.Misalnya:
Di sini backticks akan membantu server untuk memahami bahwa
database
sebenarnya adalah nama database, database pengenal.Yang sama dapat dilakukan untuk nama tabel dan nama kolom. Ini adalah sangat kebiasaan yang baik jika anda membungkus database pengenal dengan backticks.
Sekarang tentang tanda kutip Ganda & tanda Kutip Tunggal (Michael telah disebutkan itu).
Tapi, untuk menentukan nilai anda harus menggunakan tanda kutip tunggal atau ganda. Mari kita lihat contoh lain.
Di sini saya sengaja dilupakan untuk membungkus
title1
dengan tanda kutip. Sekarang server akan mengambiltitle1
sebagai nama kolom (yaitu identifier). Jadi, untuk menunjukkan bahwa itu's nilai anda harus menggunakan tanda kutip ganda atau tunggal.Sekarang, dalam kombinasi dengan PHP, tanda kutip ganda dan single quotes membuat permintaan anda waktu menulis jauh lebih mudah. Let's lihat versi modifikasi dari query di atas pertanyaan anda.
Sekarang, dengan menggunakan tanda kutip ganda di PHP, anda akan membuat variabel
$val1
, dan$val2
untuk menggunakan nilai-nilai mereka sehingga menciptakan sah query. Sepertiakan membuat
Di MySQL, simbol-simbol ini digunakan untuk membatasi permintaan
`
,"
,'
dan()
."
atau'
digunakan untuk melampirkan string-seperti nilai-nilai"26-01-2014 00:00:00"
atau'26-01-2014 00:00:00'
. Simbol-simbol ini hanya untuk string, fungsi agregat sepertisekarang
,jumlah
, ataumax
.`
digunakan untuk melampirkan tabel atau kolom nama, misalnyapilih `column_name` dari `table_name` where id='2'
(
dan)
hanya menyertakan bagian-bagian dari sebuah query misalnyapilih `column_name` dari `table_name` mana (id='2' dan jenis kelamin='laki-laki') atau name='saat'
.String literals dalam MySQL dan PHP adalah sama.
Jadi jika anda string berisi tanda kutip tunggal, maka anda bisa menggunakan tanda kutip ganda untuk mengutip string, atau jika mengandung tanda kutip ganda, maka anda bisa menggunakan tanda kutip tunggal untuk mengutip string. Tapi jika anda string berisi tanda kutip tunggal dan tanda kutip ganda, anda perlu untuk melarikan diri salah satu yang digunakan untuk mengutip string.
Sebagian besar, kita menggunakan tanda kutip tunggal untuk SQL string value, sehingga kita perlu menggunakan tanda kutip ganda untuk PHP string.
Dan anda bisa menggunakan variabel di PHP's double-quoted string:
Tapi jika
$val1
atau$val2
berisi tanda kutip tunggal, yang akan membuat SQL anda menjadi salah. Jadi, anda perlu untuk melarikan diri sebelum digunakan dalam sql, yaitu apa yangmysql_real_escape_string
adalah untuk. (Meskipun pernyataan siap lebih baik.)Dalam kombinasi PHP dan MySQL, tanda kutip ganda dan single quotes membuat permintaan anda-menulis waktu jadi jauh lebih mudah.
Sekarang, misalkan anda menggunakan posting langsung ke dalam variable query MySQL kemudian, gunakan cara ini:
Ini adalah praktek terbaik untuk menggunakan variabel PHP ke MySQL.
Telah ada banyak jawaban di sini, umumnya berpuncak menjadi dua poin.
DAN sebagai @MichaelBerkowski kata
Ada kasus di mana meskipun identifier tidak dapat menjadi reserved kata kunci atau mengandung spasi atau karakter luar set terbatas* tapi tentu memerlukan backticks di sekitar mereka.
CONTOH
123E10
adalah sebuah identifier yang valid nama tetapi juga berlakuINTEGER
literal.[Tanpa masuk ke detail bagaimana anda akan mendapatkan sebuah identifier nama], Misalkan saya ingin membuat tabel sementara bernama
123456e6
.Tidak ada KESALAHAN pada backticks.
KESALAHAN ketika tidak menggunakan backticks.
Namun,
123451a6
adalah baik-baik saja nama identifier (tanpa kembali kutu).Ini adalah benar-benar karena
1234156e6
juga eksponensial nomor.Jika tabel cols dan nilai-nilai variabel maka ada dua cara:
Dengan tanda kutip ganda
","
lengkap query:Atau
Dengan tanda kutip tunggal
''
:Menggunakan kembali kutu
`
ketika kolom/nilai nama ini mirip dengan MySQL reserved kata kunci.Catatan: Jika anda menunjukkan kolom nama dengan nama tabel kemudian menggunakan kembali kutu seperti ini:
`table_name
.
column_name
<-- Catatan: mengecualikan
.` dari kutu.Tanda kutip tunggal harus digunakan untuk string nilai-nilai seperti nilai-NILAI() daftar.
Backticks umumnya digunakan untuk menunjukkan tanda pengenal dan juga aman dari sengaja menggunakan kata kunci cadangan.
Dalam kombinasi PHP dan MySQL, tanda kutip ganda dan single quotes membuat permintaan anda menulis waktu jadi jauh lebih mudah.
Selain itu semua (menjelaskan) jawaban, belum ada't telah disebutkan berikut dan yang saya kunjungi ini Q&A cukup sering.
Singkatnya; MySQL berpikir anda ingin melakukan matematika sendiri tabel/kolom dan menafsirkan tanda hubung seperti "e-mail" sebagai
e
minusmail
.Disclaimer: Jadi saya pikir saya akan tambahkan ini sebagai "INFO" jenis jawaban bagi mereka yang benar-benar baru untuk bekerja dengan database dan yang mungkin tidak memahami istilah-istilah teknis yang sudah dijelaskan.
SQL server dan MySQL, PostgreySQL, Oracle don't memahami tanda kutip ganda("). Dengan demikian query anda harus bebas dari tanda kutip ganda(") dan hanya boleh menggunakan tanda kutip tunggal(').
Kembali-perjalanan(`) adalah opsional untuk digunakan dalam SQL digunakan untuk nama tabel, nama db dan nama kolom.
Jika anda mencoba untuk menulis query di back-end untuk memanggil MySQL maka anda dapat menggunakan double quote(") atau tanda kutip tunggal(') untuk menetapkan query untuk variabel seperti:
Jika ada's
di mana
pernyataan di query anda dan/atau mencoba untukmemasukkan
nilai dan/atauupdate
dari nilai yang merupakan string menggunakan kutip tunggal(') untuk nilai-nilai seperti:Jika anda ingin tetap keluar dari kebingungan ini kapan harus menggunakan tanda kutip ganda(") dan tanda kutip tunggal('), akan merekomendasikan untuk tetap dengan tanda kutip tunggal(') ini akan mencakup backslash() seperti:
Masalah dengan double(") atau tunggal(') kutipan timbul ketika kita harus menetapkan beberapa nilai yang dinamis dan melakukan beberapa rangkaian string seperti:
Jika perlu izin lebih lanjut mengikuti kutipan di JavaScript