MySQL'de tek tırnak, çift tırnak ve ters tırnak ne zaman kullanılır?

Sorgu yazmanın en iyi yolunu öğrenmeye çalışıyorum. Tutarlı olmanın önemini de anlıyorum. Şimdiye kadar, hiç düşünmeden rastgele tek tırnak, çift tırnak ve geri işaretleri kullandım.

Örnek:

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

Ayrıca, yukarıdaki örnekte table, col1, val1, vb. değişkenler olabileceğini düşünün.

Bunun standardı nedir? Siz ne yapıyorsunuz?

Yaklaşık 20 dakikadır burada benzer sorulara verilen cevapları okuyorum, ancak bu sorunun kesin bir cevabı yok gibi görünüyor.

Çözüm

Ters işaretler tablo ve sütun tanımlayıcıları için kullanılmalıdır, ancak yalnızca tanımlayıcı bir MySQL ayrılmış anahtar sözcüğü olduğunda veya tanımlayıcı boşluk karakterleri veya sınırlı bir kümenin ötesinde karakterler içerdiğinde gereklidir (aşağıya bakın) Alıntı sorunundan kaçınmak için, mümkün olduğunda ayrılmış anahtar sözcükleri sütun veya tablo tanımlayıcıları olarak kullanmaktan kaçınılması önerilir.

Tek tırnak işaretleri VALUES() listesinde olduğu gibi dize değerleri için kullanılmalıdır. Çift tırnak MySQL tarafından dize değerleri için de desteklenir, ancak tek tırnak diğer RDBMS tarafından daha yaygın olarak kabul edilir, bu nedenle çift yerine tek tırnak kullanmak iyi bir alışkanlıktır.

MySQL ayrıca DATE ve DATETIME değişmez değerlerinin '2001-01-01 00:00:00' gibi dizeler olarak tek tırnaklı olmasını bekler. Daha fazla ayrıntı için, özellikle tarih dizelerinde segment sınırlayıcı olarak tire - kullanmanın alternatifleri için Tarih ve Saat Değişmezleri belgesine bakın.

Bu nedenle, örneğinizi kullanarak, PHP dizesini çift tırnak içine alır ve 'val1', 'val2' değerleri için tek tırnak kullanırdım. NULL` bir MySQL anahtar sözcüğüdür ve özel bir (olmayan) değerdir ve bu nedenle tırnak içine alınmaz.

Bu tablo veya sütun tanımlayıcılarının hiçbiri ayrılmış kelime değildir veya tırnak içine alınmasını gerektiren karakterler kullanmaz, ancak ben yine de bunları ters işaretlerle tırnak içine aldım (bu konuda daha sonra daha fazla bilgi vereceğim...).

RDBMS'ye özgü işlevler (örneğin, MySQL'deki NOW()) tırnak içine alınmamalıdır, ancak argümanları daha önce bahsedilen aynı dize veya tanımlayıcı tırnak içine alma kurallarına tabidir.

Backtick (`)
tablo & sütun ───────┬┬┬─────────────────────────┬───────────┬───────────┬──────────────┐
                      ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`)
                       VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())";
                               ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
Kotasız anahtar kelime ─────┴┴┴┘ │ │ │ │ │ │ │││││
Tek tırnaklı (') dizeler ───────────┴────┴──┴────┘ │ │ │││││
Tek tırnaklı (') TARİH ───────────────────────────┴──────────┘ │││││
Tırnaksız fonksiyon ─────────────────────────────────────────┴┴┴┴┘

Değişken enterpolasyonu

Değişkenler için tırnak içine alma kalıpları değişmez, ancak değişkenleri doğrudan bir dizgeye enterpolasyon yapmak istiyorsanız, PHP'de çift tırnak içine alınmalıdır. SQL'de kullanmak için değişkenleri uygun şekilde öncelediğinizden emin olun. (SQL enjeksiyonuna karşı koruma olarak, bunun yerine hazır deyimleri destekleyen bir API kullanılması önerilir).

// Bazı değişken değişiklikleriyle aynı şey
// Burada, $table değişken tablo adı ters tırnak içine alınır ve değişkenler
// VALUES listesindeki öğeler tek tırnaklıdır
$query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";

Hazırlanmış ifadeler

Hazır deyimlerle çalışırken, deyimin yer tutucularının alıntılanması gerekip gerekmediğini belirlemek için belgelere başvurun. PHP'deki en popüler API'ler olan PDO ve MySQLi, diğer dillerdeki hazır deyim API'lerinin çoğunda olduğu gibi unquoted yer tutucuları bekler:

// 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 (?, ?, ?, ?)";

Tanımlayıcılarda geri tik alıntısı gerektiren karakterler:

MySQL belgelerine göre, aşağıdaki karakter kümesini kullanan tanımlayıcıları tırnak içine almanıza (backtick) gerek yoktur:

ASCII: [0-9,a-z,A-Z$_] (temel Latin harfleri, 0-9 arası rakamlar, dolar, alt çizgi)

Tablo veya sütun tanımlayıcıları olarak, örneğin boşluk dahil olmak üzere, bu kümenin dışındaki karakterleri kullanabilirsiniz, ancak daha sonra bunları tırnak içine almanız (backtick) gerekir.

Yorumlar (11)

Geri işaretleri genellikle bir "tanımlayıcıyı" belirtmek ve Ayrılmış Anahtar Kelimeler'in yanlışlıkla kullanılmasına karşı güvenli olmak için kullanılır.

Örneğin:

Use `database`;

Burada ters işaretler sunucunun veritabanının aslında veritabanı tanımlayıcısı değil, veritabanının adı olduğunu anlamasına yardımcı olacaktır.

Aynı şey tablo adları ve alan adları için de yapılabilir. Veritabanı tanımlayıcınızı ters işaretlerle sararsanız bu çok iyi bir alışkanlıktır.

Backticks hakkında daha fazla bilgi edinmek için this yanıtını kontrol edin.


Şimdi Çift tırnak & Tek Tırnaklar hakkında (Michael zaten bundan bahsetti).

Ancak, bir değer tanımlamak için tek veya çift tırnak kullanmanız gerekir. Başka bir örnek görelim.

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

Burada kasıtlı olarak title1 i tırnak içine almayı unuttum. Şimdi sunucu title1i bir sütun adı (yani bir tanımlayıcı) olarak alacaktır. Dolayısıyla, bunun bir değer olduğunu belirtmek için çift ya da tek tırnak işareti kullanmanız gerekir.

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

Şimdi, PHP ile birlikte, çift tırnak ve tek tırnak sorgu yazma zamanınızı çok daha kolaylaştırır. Sorunuzdaki sorgunun değiştirilmiş bir versiyonunu görelim.

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

Şimdi, PHP'de çift tırnak kullanarak, $val1 ve $val2 değişkenlerinin değerlerini kullanmasını sağlayacak ve böylece tamamen geçerli bir sorgu oluşturacaksınız. Mesela

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

yapacak

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

Tablo sütunları ve değerleri değişken ise iki yol vardır:

Çift tırnak içinde "" sorgunun tamamı:

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

Ya da

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

Tek tırnak işareti ile '':

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

Bir sütun/değer adı MySQL'de ayrılmış bir anahtar sözcüğe benziyorsa `` işaretlerini kullanın.

Not: Bir sütun adını bir tablo adıyla belirtiyorsanız, aşağıdaki gibi geri tik işaretleri kullanın:

`tablo_adı`. `column_name`

Yorumlar (0)