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.

Mengomentari pertanyaan (1)
Larutan

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 dan DATETIME 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.

Backtick (`)
meja & kolom ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$query = "INSERT INTO `meja` (`id`, `col1`, `col2`, `tanggal`, `updated`) 
VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ 
Kata kunci yang dikutp ─────┴┴┴┘ │ │ │ │ │ │ │││││
Single-quoted (') string ───────────┴────┴──┴────┘ │ │ │││││
Single-quoted (') TANGGAL ───────────────────────────┴──────────┘ │││││
Dikutp fungsi ─────────────────────────────────────────┴┴┴┴┘ 

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).

// Sama dengan beberapa variabel pengganti
// Di sini, variabel nama tabel $tabel backtick-dikutip, dan variabel
// dalam daftar NILAI yang single-quoted 
$query = "INSERT INTO `$tabel` (`id`, `col1`, `col2`, `tanggal`) VALUES (NULL, '$val1', '$val2', '$tanggal')";

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:

// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";

// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";

Karakter requring backtick mengutip dalam pengidentifikasi:

Menurut dokumentasi MySQL, anda tidak perlu quote (backtick) pengidentifikasi berikut menggunakan set karakter:

ASCII: [0-9,a-z,A-Z$_] (dasar huruf Latin, angka 0-9, dollar, garis bawah)

Anda dapat menggunakan karakter luar yang ditetapkan sebagai tabel atau kolom pengidentifikasi, termasuk spasi misalnya, tapi kemudian anda must kutipan (backtick) mereka.

Komentar (11)

Ada dua jenis kutipan di MySQL:

  1. ' untuk melampirkan string literals
  2. ` untuk melampirkan pengenal seperti tabel dan nama kolom

Dan kemudian ada " yang merupakan kasus khusus. Itu bisa digunakan untuk one dari yang disebutkan di atas tujuan-tujuan di waktu tergantung pada MySQL server's sql_mode:

  1. By default the " karakter yang dapat digunakan untuk melampirkan string literals hanya suka '
  2. Di 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:

SELECT "column" FROM table WHERE foo = "bar"

ANSI_QUOTES dinonaktifkan

Permintaan akan pilih string literal "kolom" dimana kolom foo sama dengan string "bar"

ANSI_QUOTES diaktifkan

Permintaan akan pilih kolom kolom di mana kolom foo adalah sama dengan kolom bar

Ketika menggunakan apa

  • Saya menyarankan agar anda menghindari menggunakan " sehingga kode anda menjadi independen dari SQL mode
  • Selalu mengutip pengidentifikasi karena itu adalah praktik yang baik (cukup beberapa pertanyaan pada JADI membahas ini)
Komentar (0)

(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:

$foo = "bar";
echo 'there is a $foo'; // There is a $foo
echo "there is a $foo"; // There is a bar
echo `ls -l`; // ... a directory list
Komentar (0)

Backticks umumnya digunakan untuk menunjukkan identifier dan juga menjadi aman sengaja menggunakan kata Kunci cadangan.

Misalnya:

Use `database`;

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.

Cek ini jawaban untuk memahami lebih lanjut tentang 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.

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, title1);

Di sini saya sengaja dilupakan untuk membungkus title1 dengan tanda kutip. Sekarang server akan mengambil title1 sebagai nama kolom (yaitu identifier). Jadi, untuk menunjukkan bahwa itu's nilai anda harus menggunakan tanda kutip ganda atau tunggal.

INSERT INTO `tablename` (`id, `title`) VALUES ( NULL, 'title1');

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.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

Sekarang, dengan menggunakan tanda kutip ganda di PHP, anda akan membuat variabel $val1, dan $val2 untuk menggunakan nilai-nilai mereka sehingga menciptakan sah query. Seperti

$val1 = "my value 1";
$val2 = "my value 2";
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

akan membuat

INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, 'my value 1', 'my value 2')
Komentar (0)

Di MySQL, simbol-simbol ini digunakan untuk membatasi permintaan ` ," ,' dan () .

  1. " 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 seperti sekarang, jumlah, atau max.

  2. ` digunakan untuk melampirkan tabel atau kolom nama, misalnya pilih `column_name` dari `table_name` where id='2'

  3. ( dan ) hanya menyertakan bagian-bagian dari sebuah query misalnya pilih `column_name` dari `table_name` mana (id='2' dan jenis kelamin='laki-laki') atau name='saat' .

Komentar (0)

String literals dalam MySQL dan PHP adalah sama.

string adalah urutan dari byte atau karakter, baik tertutup dalam kutip tunggal ("'") atau kutip ganda (""") karakter.

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.

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";

Dan anda bisa menggunakan variabel di PHP's double-quoted string:

$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";

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 yang mysql_real_escape_string adalah untuk. (Meskipun pernyataan siap lebih baik.)

Komentar (0)

Dalam kombinasi PHP dan MySQL, tanda kutip ganda dan single quotes membuat permintaan anda-menulis waktu jadi jauh lebih mudah.

$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";

Sekarang, misalkan anda menggunakan posting langsung ke dalam variable query MySQL kemudian, gunakan cara ini:

$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";

Ini adalah praktek terbaik untuk menggunakan variabel PHP ke MySQL.

Komentar (4)

Telah ada banyak jawaban di sini, umumnya berpuncak menjadi dua poin.

  1. BACKTICKS(`) digunakan di seluruh identifier nama.
  2. Tanda KUTIP TUNGGAL(') digunakan di sekitar nilai-nilai.

DAN sebagai @MichaelBerkowski kata

Backticks yang akan digunakan untuk tabel dan kolom pengidentifikasi, tetapi hanya diperlukan ketika identifier adalah MySQL dilindungi 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.

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 berlaku INTEGER 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.

DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

KESALAHAN ketika tidak menggunakan backticks.

DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1

Namun, 123451a6 adalah baik-baik saja nama identifier (tanpa kembali kutu).

DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)

Ini adalah benar-benar karena 1234156e6 juga eksponensial nomor.

Komentar (0)

Jika tabel cols dan nilai-nilai variabel maka ada dua cara:

Dengan tanda kutip ganda "," lengkap query:

$query = "INSERT INTO $table_name (id, $col1, $col2)
                 VALUES (NULL, '$val1', '$val2')";

Atau

 $query = "INSERT INTO ".$table_name." (id, ".$col1.", ".$col2.")
               VALUES (NULL, '".$val1."', '".$val2."')";

Dengan tanda kutip tunggal'':

$query = 'INSERT INTO '.$table_name.' (id, '.$col1.', '.$col2.')
             VALUES (NULL, '.$val1.', '.$val2.')';

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.

Komentar (0)

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.

Komentar (0)

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 minus mail.


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.

Komentar (0)

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:

let query = "select id, name from accounts";
//Or
let query = 'select id, name from accounts';

Jika ada's di mana pernyataan di query anda dan/atau mencoba untuk memasukkan nilai dan/atau update dari nilai yang merupakan string menggunakan kutip tunggal(') untuk nilai-nilai seperti:

let querySelect = "select id, name from accounts where name = 'John'";
let queryUpdate = "update accounts set name = 'John' where id = 8";
let queryInsert = "insert into accounts(name) values('John')";

//Please not that double quotes are only to be used in assigning string to our variable not in the query
//All these below will generate error

let querySelect = 'select id, name from accounts where name = "John"';
let queryUpdate = 'update accounts set name = "John" where id = 8';
let queryInsert = 'insert into accounts(name) values("John")';

//As MySQL or any SQL doesn't understand double quotes("), these all will generate error.

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:

let query = 'select is, name from accounts where name = \'John\'';

Masalah dengan double(") atau tunggal(') kutipan timbul ketika kita harus menetapkan beberapa nilai yang dinamis dan melakukan beberapa rangkaian string seperti:

let query = "select id, name from accounts where name = " + fName + " " + lName;
//This will generate error as it must be like name = 'John Smith' for SQL
//However our statement made it like name = John Smith

//In order to resolve such errors use
let query = "select id, name from accounts where name = '" + fName + " " + lName + "'";

//Or using backslash(\)
let query = 'select id, name from accounts where name = \'' + fName + ' ' + lName + '\'';

Jika perlu izin lebih lanjut mengikuti kutipan di JavaScript

Komentar (0)