.NETのクラスからテーブルを生成していますが、1つの問題は、MySQLの予約キーワードであるフィールド名key
を持つ可能性があることです。 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;
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予約語 )
バックティック文字( `)を使用する必要があります。例:
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;
異なるSQLサーバー間の移植性に関心がある場合は、ANSI SQLクエリを使用する必要があります。 ANSI SQLでの文字列エスケープは、二重引用符( ")を使用して行われます。残念ながら、このエスケープメソッドは、ANSI互換モードで設定されていない限り、MySQLに移植できません。
個人的に、私は常に--sql-mode = 'ANSI'引数でMySQLサーバーを起動します。これは両方のエスケープ方法を許可するためです。セットアップされていない/自分で制御されているMySQLサーバーで実行されるクエリを作成している場合、次のことができます。
次の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スクリプトを取得してモードをリセットすることです。