Sütun adı olarak kullanılan ayrılmış sözcüklerden nasıl kaçarım? MySQL / Tablo Oluştur


139

Ben .NET sınıflardan tablolar üretiyorum ve bir sorun bir sınıf keybir ayrılmış MySQL anahtar kelime olan bir alan adı olabilir . Tablo oluştur ifadesinde bu durumdan nasıl çıkabilirim? (Not: Aşağıdaki diğer sorun, metnin dizine eklenmesi / benzersiz olması için sabit bir boyut olmalıdır)

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
key TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

Yanıtlar:


184

ANSI SQL modu etkinse çift ​​tırnak kullanabilirsiniz

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     "key" TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

veya aksi takdirde kaçan tescilli arka kene. ( `Çeşitli klavye düzenlerinde karakterin nerede bulunacağı bu cevapta ele alınmıştır )

CREATE TABLE IF NOT EXISTS misc_info
  (
     id    INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
     `key` TEXT UNIQUE NOT NULL,
     value TEXT NOT NULL
  )
ENGINE=INNODB; 

(Kaynak: MySQL Referans Kılavuzu, 9.3 Ayrılmış Kelimeler )


5
IMHO tüm alan adlarını ve tablo adlarını her zaman alıntılamalıdır.
rjmunro

10
@rjmunro - Bunu yapmak, daha sonraki sürümlerde tanıtılan yeni ayrılmış anahtar kelimelere karşı sizi koruduğundan biraz daha savunmacıdır, ancak görsel dağınıklığı sevmiyorum.
Martin Smith

Aynı düzeltme (kaçmak için çift tırnak) Cassandra'nın CQL'deki anahtar kelimeler için de geçerlidir. Biraz konu dışı, biliyorum, ama bu konu Cassandra'ya özgü bir aramada ortaya çıktı.
Godfrey Duke

MySQL Referans Kılavuzu bağlantısı şimdilik bozuk. Gerçek bağlantı: dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

71

Geri işaretleme karakterini (`) kullanmalısınız, örneğin:

create table if not exists misc_info (
id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL,
`key` TEXT UNIQUE NOT NULL,
value TEXT NOT NULL)ENGINE=INNODB;

15

Farklı SQL sunucuları arasında taşınabilirlikle ilgileniyorsanız ANSI SQL sorgularını kullanmalısınız. ANSI SQL'de dize kaçmak çift tırnak (") kullanılarak yapılır. Ne yazık ki, bu kaçış yöntemi ANSI uyumluluk modunda ayarlanmadığı sürece MySQL için taşınabilir değildir.

Şahsen, MySQL sunucumu her zaman --sql-mode = 'ANSI' argümanı ile başlatırım, çünkü bu her iki yöntem için de kaçmaya izin verir. Kurulumunuz / sizin tarafınızdan denetlenmeyen bir MySQL sunucusunda yürütülecek sorgular yazıyorsanız, şunları yapabilirsiniz:

  • Tüm SQL sorgularınızı ANSI SQL'de yazın
  • Bunları aşağıdaki MySQL'e özgü sorgulara ekleyin:

    SET @OLD_SQL_MODE=@@SQL_MODE;
    SET SESSION SQL_MODE='ANSI';
    -- ANSI SQL queries
    SET SESSION SQL_MODE=@OLD_SQL_MODE;

Bu şekilde, yalnızca MySQL'e özgü sorgular .sql betiğinizin başında ve sonunda olur. Onları farklı bir sunucu için ne gönderirseniz, bu 3 sorguyu kaldırmanız yeterlidir. Daha da rahat, yukarıdaki mod ayar sorgularını içerecek script_mysql.sql adlı bir komut dosyası oluşturabilir, bir script_ansi.sql komut dosyası kaynaklayabilir ve modu sıfırlayabilirsiniz.


Bu harika! Sorguyu bir kez yazabilir ve sadece MySQL yığınları için bir anahtar koyabilirim!
ravemir
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.