列名として使用されている予約語をエスケープするにはどうすればよいですか?MySQL /テーブルを作成


139

私は.NETのクラスからテーブルを生成していますが、1つの問題は、クラスがkey予約済みのMySQLキーワードであるフィールド名を持っている可能性があることです。create tableステートメントでエスケープするにはどうすればよいですか?(注:以下の他の問題は、テキストがインデックス化/一意になるように固定サイズでなければならないことです)

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;

回答:


184

ANSI SQLモードが有効になっている場合は、二重引用符を使用できます

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; 

それ以外の場合は、独自のバックティックがエスケープします。(`さまざまなキーボードレイアウトで文字を見つける場所は、この回答でカバーされています

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; 

(出典:MySQLリファレンスマニュアル、9.3予約語


5
私見では、常にすべてのフィールド名とテーブル名を引用する必要があります。
rjmunro 2013

10
@rjmunro-新しい予約キーワードが新しいバージョンで導入されるのを防ぐので、そうすることはいくぶん防御的ですが、視覚的な混乱は好きではありません。
マーティン・スミス

同じ修正(エスケープするための二重引用符)は、CassandraのCQLのキーワードにも機能します。少し話題外ですが、このスレッドはCassandra固有の検索で浮上しました。
Godfrey Duke

MySQLリファレンスマニュアルのリンクは今のところ壊れています。実際のリンク:dev.mysql.com/doc/refman/5.7/en/keywords.html
Miha_x64

70

バックティック文字( `)を使用する必要があります。例:

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

異なるSQLサーバー間の移植性に関心がある場合は、ANSI SQLクエリを使用する必要があります。ANSI SQLでの文字列エスケープは、二重引用符( ")を使用して行われます。残念ながら、このエスケープ方法は、ANSI互換モードに設定されていない限り、MySQLに移植できません。

個人的には、MySQLサーバーを常に--sql-mode = 'ANSI'引数で起動します。これにより、両方の方法でエスケープできるためです。MySQLサーバーで実行されるクエリを記述していて、セットアップまたは制御されていない場合は、次のことを実行できます。

  • すべてのSQLクエリをANSI SQLで記述します
  • それらを次のMySQL固有のクエリで囲みます。

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

このようにして、MySQL固有のクエリのみが.sqlスクリプトの最初と最後にあります。それらを別のサーバーに出荷する場合は、これらの3つのクエリを削除するだけで準備は完了です。さらに便利なのは、上記のモード設定クエリを含むscript_mysql.sqlという名前のスクリプトを作成し、script_ansi.sqlスクリプトを読み込み、モードをリセットすることです。


これは素晴らしい!クエリを1回記述して、MySQLスタックのスイッチを入れるだけです。
ravemir
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.