エンコード
SQL エスケープ
SQL 標準の文字列リテラルエスケープを行います (シングルクォート ' を '' に変換)。表示 / 記録目的のための処理で、ユーザー入力を SQL に組み立てる際は必ずプレースホルダ (パラメータ化クエリ) を使ってください。SQLi 対策にはなりません。
サンプル
直近の入力
全履歴 ·
履歴はあなたのブラウザにのみ保存されます。サーバーに送信されません。 設定
こんなときに使う
SQL のサンプルをドキュメントに貼る
ブログ記事に「SELECT * FROM users WHERE name = 'O''Brien'」のような SQL を載せたいとき、内部のシングルクォートをエスケープ。
ログに SQL をそのまま記録
アプリログに SQL を残すとき、文字列リテラル内のクォートをエスケープして、貼り戻すと再実行可能な形にしておきます。
DB マイグレーション SQL を手作業で書く
INSERT 文に文字列値を埋め込む際、シングルクォートを含む人名(O'Brien など)を正しく書きます。
テストデータの SQL ダンプを作る
テスト用 INSERT 文を量産するとき、CSV から取り込んだ値の ' をエスケープ。
ストアドプロシージャ内の動的 SQL を確認
EXEC / sp_executesql で構築している SQL を再現するときの値表示。実装を見直してプレースホルダ化する判断材料に。
アンエスケープして元の文字列を取り出す
ログから取り出した SQL 文字列リテラルを、データ値として扱うために '' を ' に戻す処理。
よくあるエラーと対処
ERR
エスケープしただけで SQLi が防げると思った - 原因
- シングルクォートのエスケープだけでは、コメント (--) や別の構造(型キャスト等)を使った攻撃が成立する可能性があります。
- 対処
- プレースホルダ(パラメータ化クエリ)を使ってください。例: PostgreSQL の `$1`、MySQL の `?`、Python の psycopg2 の `%s`。
ERR
MySQL で動かない(バックスラッシュ問題) - 原因
- MySQL は NO_BACKSLASH_ESCAPES が無効だと \' でもエスケープになります。SQL 標準とは異なります。
- 対処
- MySQL では mysql_real_escape_string などライブラリ関数を使ってください。本ツールは SQL 標準('' のみ)です。
ERR
アイデンティファイア(テーブル名 / カラム名)に使えない - 原因
- テーブル名・カラム名は文字列リテラルではなく識別子で、エスケープルールが違います(PostgreSQL は ", MySQL は `)。
- 対処
- 識別子のエスケープには別の手段を使ってください。本ツールは文字列値のみ。
ERR
Unicode 制御文字や NULL バイトを含む値 - 原因
- DB によっては NULL バイトを許容しません。
- 対処
- 事前にバイト列を確認・除去してください。本ツールはシングルクォートしか扱いません。
CLI / 他言語でやる方法
PostgreSQL psql
psql -c "SELECT quote_literal('O''Brien')" quote_literal は SQL 用エスケープ + クォート。E'...' リテラルも併用。
MySQL mysql_real_escape_string
mysql_real_escape_string($conn, $value) PHP の MySQL 拡張から。MySQL の方言を考慮。
Python psycopg2
cur.execute('SELECT * FROM t WHERE a = %s', (value,)) プレースホルダを使う正攻法。手動エスケープしない。
よくある質問
▶ プレースホルダを使えば本ツールは不要?
アプリでは不要です。本ツールは表示・ログ・サンプル提示などの「人が読む SQL を整える」用途です。
▶ シングルクォート以外のエスケープは必要?
SQL 標準では ' のみ。MySQL や一部 DB はバックスラッシュも特別扱いするモードがあります。SQL Server は標準準拠で ' のみです。
▶ コメント (--) の混入を防ぐには?
プレースホルダで完全に防げます。手で組み立てる場合は -- や /* */ を含む値を許容しないバリデーション層が必要です。
▶ PostgreSQL の dollar quoting は?
$$...$$ で囲むエスケープ不要のリテラル形式があります。動的に生成された SQL より、リテラルの SQL を書くときに便利です。
▶ ORM を使えばエスケープは不要?
ほとんどの ORM はパラメータ化クエリを内部で使うので安全です。raw query / 生 SQL を発行する API を使う場合のみ手動エスケープが必要。
▶ LIKE 句のワイルドカード(% _)はどうする?
値として % や _ を含めたい場合、LIKE 用の追加エスケープが必要です。SQL: `LIKE 'foo\%' ESCAPE '\'`。本ツールはリテラルエスケープのみで、LIKE エスケープは行いません。
▶ Unicode 文字はエスケープされる?
本ツールでは ' しかエスケープしません。Unicode 文字はそのまま通します。DB 側の文字コード設定(UTF-8 など)に従って正しく保存されます。
▶ サーバーに送信されますか?
送信されません。ブラウザ内で完結します。機密 SQL も安心。