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 文字列エスケープの使い方
- エスケープ方式 を選びます:標準 SQL または MySQL。
- 必要なら 結果をシングルクォートで囲む にチェックを入れます。
- 生の値を入力欄に入力または貼り付けます。
- エスケープされた出力を 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 は文字列内のバックスラッシュをエスケープ文字として扱うため、バックスラッシュもエスケープする必要があります。