SQL 文字列エスケープ

シングルクォートで囲む SQL 文字列の中で使うテキストをエスケープ:引用符を重ねる(標準 SQL)か、MySQL のバックスラッシュエスケープを使います。引用符で囲むオプションもあります。

' はすべて '' になります。PostgreSQL、SQLite、SQL Server、Oracle、NO_BACKSLASH_ESCAPES を有効にした MySQL で使えます。アプリのコードではパラメータ化クエリを使ってください。

出力

すべてブラウザ内で実行されます。データがアップロードされることはありません。

関連ツール

すべて表示

SQL 文字列エスケープとは?

SQL エスケープは、生のテキストの値を、シングルクォートで囲んだ SQL 文字列リテラルの中に置ける形に変換します。標準モードではすべてのシングルクォートを重ねます(O'Reilly → O''Reilly)。MySQL モードでは、mysql_real_escape_string() のようにバックスラッシュエスケープを使います。SQL を手書きするためのもので、アプリケーションのコードでは代わりにパラメータ化クエリを使ってください。

SQL 文字列エスケープの使い方

  1. エスケープ方式 を選びます:標準 SQL または MySQL。
  2. 必要なら 結果をシングルクォートで囲む にチェックを入れます。
  3. 生の値を入力欄に入力または貼り付けます。
  4. エスケープされた出力を SQL にコピーします。

例

入力
O'Reilly \ x
出力
O''Reilly \ x

標準 SQL モード:引用符は重ねられ、バックスラッシュはそのままです。

SQL 文字列エスケープを使うべき場面

アポストロフィを含むテキストを持つ、1 回限りの SQL 文、シードデータ、マイグレーションスクリプトを書くときに使います。アプリケーションで SQL インジェクション対策として文字列のエスケープを使わないでください。バインドパラメータ付きのプリペアドステートメントを使います。識別子(テーブル名・列名)のエスケープは別の問題で、対象外です。

SQL 文字列エスケープの仕組み

標準 SQL(ANSI。PostgreSQL、SQLite、SQL Server、Oracle、NO_BACKSLASH_ESCAPES を有効にした MySQL):各 ' は '' になり、バックスラッシュはリテラルでそのままです。MySQL モード(既定の MySQL/MariaDB の設定):\0、改行、復帰、バックスラッシュ、'、"、Ctrl+Z(0x1A)の前にバックスラッシュが付き、mysql_real_escape_string() と一致します。標準モードの改行は、SQL リテラル内で有効な、実際の改行のままです。

一般的な使用例

  • 手動の INSERT に O'Reilly のような名前を入れる
  • 引用符付きのテキストを含むシードやマイグレーションのスクリプトを書く
  • MySQL のダンプ用にリテラル文字列を準備する
  • ANSI と MySQL のエスケープの違いを理解する

セキュリティ注意事項

エスケープはプリペアドステートメントの代わりにはなりません。すべてローカルで処理され、サーバーには何も送信されません。

よくある質問

エスケープだけで SQL インジェクションを防げますか?

いいえ。パラメータ化クエリを使ってください。エスケープは間違えやすく、サーバーの設定や文字セットに依存します。

PostgreSQL ではどのモードを使えばよいですか?

標準 SQL です。PostgreSQL 9.1 以降、通常の文字列内のバックスラッシュはリテラルです。

MySQL で異なるエスケープが必要なのはなぜですか?

既定では MySQL は文字列内のバックスラッシュをエスケープ文字として扱うため、バックスラッシュもエスケープする必要があります。

おすすめの次のステップ

他のカテゴリを見る