Menggunakan backticks di sekitar nama bidang

172

Setelah membaca beberapa jawaban dan komentar pada beberapa pertanyaan SQL di sini, dan juga mendengar bahwa seorang teman saya bekerja di tempat yang memiliki kebijakan yang melarang mereka, saya bertanya-tanya apakah ada yang salah dengan menggunakan backticks di sekitar nama field di MySQL .

Itu adalah:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...
nickf
sumber
24
backticks benar-benar berguna jika Anda ingin memiliki nama kolom seperti count, type, tableatau serupa
knittl
1
lihat juga stackoverflow.com/questions/23446377/…
Ian Ringrose
@knittl Saya pikir pertanyaannya adalah, harus Anda memiliki nama kolom seperti count, type, dan table. Itu adalah istilah yang sangat ambigu dan dalam hampir setiap kasus nama-nama itu dapat ditingkatkan menjadi lebih spesifik. Memberi nama pada kolom Anda hal-hal seperti itu juga berbahaya dan berpotensi menjadi sumber kesalahan, karena Anda tidak pernah tahu kapan seseorang mungkin lupa menambahkan backtick atau tidak menyadari mereka harus melakukannya. Saya pikir ini praktik yang lebih baik untuk menghindari penggunaan istilah yang dicadangkan sebagai nama kolom.
dallin
Saya selalu menggunakannya dan karenanya saya tidak berjalan dalam bahaya menggunakan kata kunci yang dipesan setiap saat.
Markus Zeller

Jawaban:

153

Menggunakan backticks memungkinkan Anda untuk menggunakan karakter alternatif. Dalam penulisan kueri itu bukan masalah seperti itu, tetapi jika orang menganggap Anda hanya dapat menggunakan backticks, saya akan menganggap itu memungkinkan Anda lolos dengan hal-hal konyol seperti

SELECT `id`, `my name`, `another field` , `field,with,comma` 

Yang tentu saja menghasilkan tabel dengan nama buruk.

Jika Anda hanya ringkas saya tidak melihat masalah dengan itu, Anda akan perhatikan jika Anda menjalankan kueri Anda seperti itu

EXPLAIN EXTENDED Select foo,bar,baz 

Peringatan yang dihasilkan yang kembali akan memiliki tanda centang kembali dan nama tabel yang memenuhi syarat. Jadi, jika Anda menggunakan fitur pembuatan kueri dan penulisan ulang kueri secara otomatis, backticks akan membuat apa pun yang menguraikan kode Anda menjadi kurang membingungkan.

Namun saya pikir, alih-alih mengamanatkan apakah Anda dapat menggunakan backticks atau tidak, mereka harus memiliki standar untuk nama. Ini memecahkan lebih banyak masalah 'nyata'.

Kent Fredric
sumber
Apakah kita perlu menggunakannya juga di PostgreSQL?
Yousuf Memon
5
Tidak perlu, hanya rekomendasi. Sangat berguna untuk mewakili mereka yang dikutip untuk menghindari ambiguitas dengan kata kunci SQL jika di masa depan, kata kunci SQL ditambahkan yang membagikan nama bidang Anda. Satu-satunya waktu Anda / kebutuhan / kutipan adalah ketika lapangan tidak berbagi nama kata kunci, misalnya, select count from foovs select "count" from fooakan memberikan hasil yang sangat berbeda. Tetapi postgres berbeda dari mysql dalam 2 cara: 1. Fields dikutip oleh "". 2. Kolom yang tidak dikutip adalah case-sensitive postgresql.org/docs/current/static/…
Kent Fredric
57

Satu-satunya masalah dengan backticks adalah bahwa mereka tidak sesuai dengan ANSI-SQL, misalnya mereka tidak bekerja di SQL Server.

Jika ada kemungkinan Anda harus mem-porting SQL Anda ke database lain, gunakan tanda kutip ganda.

Alexander Kojevnikov
sumber
15
Ya. Gunakan mode ANSI MySQL - dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html - untuk mengaktifkan tanda kutip ganda di MySQL dan dengan demikian mendapatkan kembali kompatibilitas lintas-database. Backticks / kutipan juga diperlukan karena Anda tidak pernah tahu apa yang akan menjadi kata yang disimpan di versi DBMS mendatang.
bobince
1
Itu sangat benar! Salah satu aplikasi server kami berjalan dengan baik sampai kami menerapkan pemutakhiran ke mesin database kami, yang menambahkan kata kunci baru. Tiba-tiba segala sesuatu yang menanyakan tabel tertentu pecah.
Miquella
@obobince Ketika saya masih baru di dev, saya memberi nama kolom rangeatau semacamnya. Ketika kami memutakhirkan ke MySQL 5, gagal karena itu kata cadangan baru!
alex
1
Jangan gunakan tanda kutip ganda. Itu tidak akan selalu berhasil. Misalnya ... HAPUS DARI app_key_storesMANA ("key" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Kueri OK, 0 baris terpengaruh (0,00 dtk) HAPUS DARI app_key_storesMANA ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Kueri OK, 5 baris terpengaruh (0,00 dtk)
Altonymous
44

Bagi saya, sangat masuk akal untuk menggunakannya setiap saat ketika berhadapan dengan nama-nama bidang.

  • Pertama, begitu Anda terbiasa, tidak ada salahnya untuk hanya menekan tombol backtick.
  • Kedua, bagi saya, membuatnya lebih mudah untuk melihat apa sebenarnya bidang dalam permintaan Anda, dan apa kata kunci atau metode.
  • Terakhir, ini memungkinkan Anda untuk menggunakan nama bidang apa pun yang Anda inginkan saat mendesain tabel Anda. Terkadang masuk akal untuk memberi nama bidang "kunci", "urutan", atau "nilai" ... yang semuanya memerlukan backtick saat merujuknya.
nickf
sumber
19
Anda juga harus menambahkan bahwa itu melindungi Anda dari kata-kata cadangan yang akan digunakan di masa depan (yang telah menggigit saya sebelumnya).
alex
5
Saya benar-benar meminta seseorang mengedit backtick tambahan dari salah satu pertanyaan saya sekali, yang membuat saya kesal, karena alasan ini adalah alasan tepat saya mengelilingi setiap variabel dengan mereka
Brian Leishman
2
Hal ini juga memungkinkan penggunaan label non-Inggris yang aman, yang saja sudah cukup untuk mendorong penggunaan backtick.
Aternus
26

Backticks bukan bagian dari standar ANSI SQL. Dari manual mysql :

Jika mode ANSI_QUOTES SQL diaktifkan, itu juga diizinkan untuk mengutip pengidentifikasi dalam tanda kutip ganda

Jadi jika Anda menggunakan backticks dan kemudian memutuskan untuk menjauh dari MySQL, Anda memiliki masalah (walaupun Anda mungkin memiliki masalah yang jauh lebih besar juga)

Greg
sumber
9

Tidak ada yang salah jika Anda terus menggunakan MYSQL, kecuali mungkin keseruan visual dari pertanyaan. Tetapi mereka mengizinkan penggunaan kata kunci yang dipesan atau ruang yang disematkan sebagai nama tabel dan kolom. Ini adalah tidak-tidak pada kebanyakan mesin basis data dan akan mencegah migrasi apa pun di lain waktu.

Adapun untuk membaca mudah, banyak orang menggunakan huruf besar untuk kata kunci SQL, misalnya.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;
Christian Lescuyer
sumber
6

Jika Anda bertanya kepada saya, backticks harus selalu digunakan. Tetapi ada beberapa alasan mengapa tim lebih suka tidak menggunakannya.

Keuntungan:

  • Menggunakannya, tidak ada kata-kata yang dicadangkan atau karakter terlarang.
  • Dalam beberapa kasus, Anda mendapatkan lebih banyak pesan kesalahan deskriptif.
  • Jika Anda menghindari praktik buruk, Anda tidak peduli, tapi ... dengan kata lain, kadang-kadang itu adalah cara yang layak untuk menghindari suntikan SQL.

Kekurangan:

  • Mereka tidak standar dan biasanya tidak portabel. Namun, selama Anda tidak menggunakan backtick sebagai bagian dari pengenal (yang merupakan praktik terburuk yang dapat saya bayangkan), Anda dapat mem-porting permintaan Anda dengan secara otomatis menghapus backticks.
  • Jika beberapa permintaan Anda berasal dari Access, mereka mungkin mengutip nama tabel dengan "(dan mungkin Anda tidak bisa menghapus semua" secara membabi buta). Namun, campuran backtick dan double quotes diperbolehkan.
  • Beberapa perangkat lunak atau fungsi bodoh memfilter kueri Anda, dan memiliki masalah dengan backtick. Namun, mereka adalah bagian dari ASCII sehingga ini berarti perangkat lunak / fungsi Anda sangat buruk.
Federico
sumber
9
Menggunakan backticks sama sekali tidak ada hubungannya dengan menghindari suntikan SQL.
Andy Lester
6
@andy mungkin membantu, karena penyerang harus menutupnya dengan backtick lain untuk disuntikkan. Memang sedikit, tapi itu masih sesuatu
jasonzhao
4

Jauh lebih mudah untuk mencari basis kode Anda untuk sesuatu di backtick. Katakanlah Anda memiliki tabel bernama event. grep -r "event" *mungkin mengembalikan ratusan hasil. grep -r "\`event\`" *akan mengembalikan apa pun yang mungkin merujuk pada basis data Anda.

EllisGL
sumber
Secara umum itu tidak benar-benar bermanfaat. Tabel yang dijumpai secara profesional diberi nama lebih seperti new_users_info daripada "umum".
ankush981
3

Yah, sejauh yang saya tahu, seluruh tujuan menggunakan backticks adalah agar Anda dapat menggunakan nama yang bertepatan dengan kata kunci yang dipesan. Jadi, jika namanya tidak bertabrakan dengan kata kunci yang dipesan, saya tidak melihat alasan untuk menggunakan backticks. Tapi, itu juga bukan alasan untuk melarang mereka.

Chris Jester-Young
sumber
2

Hal sederhana tentang backtick `` digunakan untuk menunjukkan pengidentifikasi seperti database_name, table_name dll, dan kutipan tunggal "" , tanda kutip ganda "" untuk string literal, sedangkan "" digunakan untuk nilai cetak apa adanya dan "" cetak variabel nilai tahan atau dalam kasus lain cetak teks yang dimilikinya.

i.e 1.-> use `model`;   
    here `model` is database name not conflict with reserve keyword 'model'
2- $age = 27;
insert into `tbl_people`(`name`,`age`,`address`) values ('Ashoka','$age',"Delhi");

here i used both quote for all type of requirement. If anything not clear let me know..
Sonpal singh Sengar
sumber
0

jika Anda menggunakan beberapa nama bidang sebagai nilai mysql atau mssql default misalnya "status", Anda harus menggunakan backticks ("pilih statusdari nama_kabel" atau "pilih id dari nama_kotak mana status= 1"). karena mysql mengembalikan kesalahan atau tidak berfungsi permintaan.

ysrtymz
sumber
0

Penggunaan utama backticks (`) dalam SQL adalah menggunakannya dalam situasi di mana Anda akan memanggil mereka lagi dalam klausa yang akan datang. Di setiap waktu lain disarankan untuk menggunakan tanda kutip ganda ("").

Sebagai contoh

SELECT CONCAT(Name, ' in ', city, ', ', statecode) AS `Publisher and Location`,
    COUNT(ISBN) AS "# Books",
    MAX(LENGTH(title)) AS "Longest Title",
    MIN(LENGTH(title)) AS "Shortest Title"
FROM Publisher JOIN Book
ON Publisher.PublisherID = Book.PublisherID WHERE INSTR(name, 'read')>0
GROUP BY `Publisher and Location`
HAVING COUNT(ISBN) > 1;

Dalam pernyataan di atas apakah Anda melihat bagaimana Publisher and Locationdigunakan lagi dalam GROUP BYklausa.

Alih-alih menggunakan

GROUP BY Nama, kota, kode negara

Saya baru saja digunakan

KELOMPOK OLEH Publisher and Location

Hanya ketika situasi seperti itu muncul, berguna untuk menggunakan backticks. Di lain waktu dianjurkan menggunakan tanda kutip ganda.

Perintah
sumber