Alan adları etrafında ters tırnaklar kullanma


172

Burada bazı SQL soruları üzerine birkaç cevap ve yorum okuduktan ve ayrıca bir arkadaşımın onları yasaklayan bir politikaya sahip bir yerde çalıştığını duyduktan sonra, MySQL'de alan adlarının çevresinde backticks kullanmanın yanlış bir şey olup olmadığını merak ediyorum .

Yani:

SELECT `id`, `name`, `anotherfield` ...
-- vs --
SELECT id, name, anotherfield ...

24
Sütun gibi isimlere sahip istiyorsanız backticks gerçekten kullanışlı count, type, tableveya benzeri
knittl


@knittl Ben, soru olduğunu düşünüyorum gerektiğini sizin gibi sütun isimleri var count, typeve table. Bunlar oldukça belirsiz terimlerdir ve neredeyse her durumda bu isimler daha spesifik olacak şekilde geliştirilebilir. Sütunlarınızı buna benzer bir şekilde adlandırmak da tehlikelidir ve potansiyel bir hata kaynağıdır; Sütun adları olarak ayrılmış terimleri kullanmaktan kaçınmanın daha iyi bir uygulama olduğunu düşünüyorum.
dallin

Onları her zaman kullanıyorum ve bu yüzden herhangi bir zamanda ayrılmış anahtar kelimeler kullandıktan sonra tehlikede değilim.
Markus Zeller

Yanıtlar:


153

Geri vuruşları kullanmak, alternatif karakterler kullanmanıza izin verir. Sorgu yazma böyle bir sorun değil, ama biri sadece backticks kullanabileceğinizi varsayarsa, bunun gibi saçma şeylerden kurtulmanızı sağlar.

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

Tabii ki kötü adlandırılmış tablolar üretir.

Sadece özlü iseniz, bununla ilgili bir sorun görmüyorum, sorgunuzu böyle çalıştırdığınızı göreceksiniz

EXPLAIN EXTENDED Select foo,bar,baz 

Geri dönen uyarı, keneler ve tam olarak nitelenmiş tablo adlarına sahip olacaktır. Dolayısıyla, sorgu oluşturma özelliklerini ve sorguların otomatik olarak yeniden yazılmasını kullanıyorsanız, geri tıklamalar kodunuzu ayrıştıran her şeyi daha az karışık hale getirir.

Ancak bence, ters çentik kullanıp kullanamayacağınızı zorunlu kılmak yerine, isimler için bir standart olması gerekir. Daha 'gerçek' problemleri çözer.


Bunları PostgreSQL'de de kullanmamız gerekiyor mu?
Yousuf Memon

5
Gerek yok, sadece öneri. Gelecekte alan adınızı paylaşan bir SQL anahtar sözcüğü eklenirse, SQL anahtar kelimeleriyle belirsizliği önlemek için alıntı yapılanları temsil etmek yararlı olacaktır. Sadece zaman / ihtiyaç / alan zaman alıntı için yapar örneğin bir anahtar kelime adı paylaşan, select count from foovs select "count" from fooçok farklı sonuçlar verecektir. Ancak postgres mysql'den 2 şekilde farklıdır: 1. Alanlar tarafından belirtilir "". 2. Belirtilmemiş alanlar büyük / küçük harfe duyarsız postgresql.org/docs/current/static/…
Kent Fredric

57

Backtick'lerle ilgili tek sorun, ANSI-SQL uyumlu olmamalarıdır, örneğin SQL Server'da çalışmazlar.

SQL'inizi başka bir veritabanına taşıma şansınız varsa, çift tırnak kullanın.


15
Evet. MySQL'de çift ​​tırnakları etkinleştirmek ve böylece veritabanları arasındaki uyumluluğu yeniden kazanmak için MySQL'in ANSI modunu ( dev.mysql.com/doc/refman/5.0/en/server-sql-mode.html) kullanın . Geri dönüşler / tırnak işaretleri de gereklidir, çünkü gelecekteki DBMS sürümlerinde neyin ayrılmış bir kelime olacağını asla bilemezsiniz.
bobince

1
Bu çok doğru! Yeni bir anahtar kelime ekleyen veritabanı motorumuza yükseltme uygulayana kadar sunucu uygulamalarımızdan biri düzgün çalışıyordu. Aniden belirli bir masayı sorgulayan her şey bozuldu.
Miquella

Ben @bobince yeni dev, bir sütun adında rangeveya böyle bir şey. MySQL 5'e yükselttiğimizde, yeni bir ayrılmış kelime olduğu için başarısız oldu!
alex

1
Çift tırnak işareti kullanmayın. Her zaman işe yaramaz. Örneğin ... app_key_storesNEREDEN SİL ("anahtar" = 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Sorgu tamam, 0 satır etkilendi (0.00 sn) app_key_storesNEREDEN SİL ( key= 'c5cc4f30-31f3-0130-505e-14dae9da9fc5_range'); Sorgu tamam, 5 satır etkilendi (0.00 sn)
Altonymous

44

Bana göre, alan adları ile uğraşırken bunları kullanmak çok mantıklı.

  • Birincisi, alışkanlık haline geldiğinizde, backtick tuşuna basmak zarar vermez.
  • İkincisi, benim için, sorgunuzdaki alanların tam olarak ne olduğunu ve anahtar kelimelerin veya yöntemlerin ne olduğunu görmeyi kolaylaştırır.
  • Son olarak, tablonuzu tasarlarken istediğiniz alan adını kullanmanızı sağlar. Bazen bir alan "anahtar", "sipariş" veya "değerler" olarak adlandırmak çok mantıklı olur ... hepsi bunlara atıfta bulunurken geri tepme gerektirir.

19
Ayrıca, gelecekte kullanılmakta olan (beni daha önce ısırmış olan) ayrılmış kelimelerden koruduğunu da eklemelisiniz.
alex

5
Aslında birisinin sorumu bir kez ekstra backticks düzenlemek vardı, bu beni üzdü, çünkü bu nedenle onlarla her değişkeni çevreleyen tam nedeni
Brian Leishman

2
Aynı zamanda, backtrick kullanımını teşvik etmek için tek başına yeterli olan İngilizce olmayan etiketlerin güvenli bir şekilde kullanılmasına izin verir.
Aternus

26

Backticks, standart ANSI SQL'in bir parçası değildir. Gönderen MySQL kılavuzuna :

ANSI_QUOTES SQL modu etkinse, tanımlayıcıları çift tırnak içine almak da mümkündür

Dolayısıyla, geri tıklamaları kullanır ve ardından MySQL'den uzaklaşmaya karar verirseniz, bir sorununuz var (muhtemelen çok daha büyük sorunlarınız olsa da)


9

Sorguların görsel bulanıklığı dışında, MYSQL kullanmaya devam ederseniz yanlış bir şey yoktur. Ancak ayrılmış anahtar kelimelerin veya gömülü alanların tablo ve sütun adları olarak kullanılmasına izin verir. Bu, çoğu veritabanı motorunda bir no-no'dur ve daha sonra herhangi bir taşımayı önleyecektir.

Kolay okumaya gelince, birçok kişi SQL anahtar kelimeleri için kapaklar kullanır, örn.

SELECT some_fied, some_other_field FROM whatever WHERE id IS NULL;

6

Bana sorarsanız, her zaman backticks kullanılmalıdır. Ancak bir takımın bunları kullanmamayı tercih etmesinin bazı nedenleri vardır.

Avantajları:

  • Bunları kullanarak ayrılmış kelimeler veya yasak karakterler yoktur.
  • Bazı durumlarda, daha açıklayıcı hata iletileri alırsınız.
  • Eğer umursamadığınız kötü uygulamalardan kaçınırsanız, ama ... gerçek anlamda, bazen SQL enjeksiyonlarından kaçınmanın iyi bir yoludur.

Dezavantajları:

  • Standart değildir ve genellikle taşınabilir değildir. Bununla birlikte, bir tanımlayıcının parçası olarak (hayal edebildiğim en kötü uygulama olan) bir backtick kullanmadığınız sürece, sorguları otomatik olarak kaldırarak sorgunuzu taşıyabilirsiniz.
  • Sorgunuzun bir kısmı Access'ten geliyorsa, tablo adlarını "(ve belki de tüm" körü körüne kaldıramazsınız) ile tırnak içine alabilir. Bununla birlikte, ters tırnak ve çift tırnak karışımlarına izin verilir.
  • Bazı aptal yazılımlar veya işlevler sorgularınızı filtreler ve ters işaretlerle ilgili sorunlar yaşar. Ancak, bunlar ASCII'nin bir parçasıdır, bu da yazılımınızın / işlevinizin çok kötü olduğu anlamına gelir.

9
Backticks kullanmanın SQL enjeksiyonlarından kaçınmakla hiçbir ilgisi yoktur.
Andy Lester

6
@andy yardımcı olabilir , çünkü bir saldırgan enjekte etmek için başka bir backtick ile kapatmalıdır. Çok az şey yapıyor, ama bu hala bir şey
jasonszhao

4

Kod tabanınızda backticks'te bir şey aramak çok daha kolay. Diyelim ki adlı bir tablonuz var event. grep -r "event" *yüzlerce sonuç getirebilir. grep -r "\`event\`" *muhtemelen veritabanınıza referansta bulunan her şeyi döndürür.


Genel olarak bu gerçekten bir fayda değil. Profesyonel olarak karşılaşılan tablolar "genel" den daha yeni_uluş_bilgi gibi adlandırılır.
ankush981

3

Bildiğim kadarıyla, backticks kullanmanın tüm amacı, ayrılmış anahtar kelimelerle çakışan adları kullanabilmenizdir. Bu nedenle, ad ayrılmış bir anahtar kelimeyle çarpışmıyorsa, geri tıklama kullanmak için herhangi bir neden göremiyorum. Ama bu da onları yasaklamak için bir sebep değil.


2

Backtick ile ilgili basit bir şey , `` veritabanı_adı, tablo_adı vb.Tek tek tırnak '' , tek tırnak '' , dize değişmezleri için çift ​​tırnak "" , "" olduğu gibi baskı değeri için kullanın ve '' değer değişkenini basılı tutun veya başka bir durumda sahip olduğu metni yazdırın.

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

0

bazı alan adlarını varsayılan mysql veya mssql değerleri olarak kullanıyorsanız, örneğin "durum", backticks (" statustable_name'den seçin " veya "table_name'den id status= = " seçin ) gerekir. çünkü mysql hata döndürür veya sorguyu çalışmaz.


0

SQL'de backticks (`) 'nin ana kullanımı, onları yaklaşan cümlelerde tekrar arayacağınız durumlarda kullanmaktır. Diğer her zaman çift tırnak ("") kullanılması önerilir.

Örneğin

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;

Yukarıdaki ifadede Publisher and Location, GROUP BYmaddede nasıl kullanıldığını görüyorsunuz .

Kullanmak yerine

GROUP BY Ad, şehir, eyalet kodu

Az önce kullandım

GRUPLA Publisher and Location

Sadece bu gibi durumlar ortaya çıktığında, ters vuruş kullanmak yararlıdır. Diğer tüm zamanlarda çift tırnak kullanılması önerilir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.