100% ローカル — データがブラウザの外に出ることはありません

SQLエスケープ|手で書くクエリに貼れる文字列リテラルにする

シングルクォートを二重にして全体を囲み、ANSI SQL の文字列リテラルにします。クライアントで手書きしているクエリに、そのまま貼り付けて使えるようになります。

高速 プライベート Cookieゼロ

Text 入力

SQL Escaped 出力

このツールの動作

2つのことを行います。シングルクォートをそれぞれ二重にし——ANSI SQL がリテラル内のクォートを書く方法です——さらに全体を引用符で囲むので、返るのは完全なリテラルです。

O'Brien   →   'O''Brien'

標準 SQL にバックスラッシュによるエスケープはないため、それ以外は何も変換されません。

往復を正確にしているのは、この囲みです。囲まなければ、単独のシングルクォートは '' になり、アンエスケープ側はこれを「引用符で囲まれた空文字列」と読むため、文字が消えてしまいます。PostgreSQL の quote_literal() や Node の SqlString.escape() が囲んだ形を返すのも同じ理由です。内側だけが必要で、自分で書いた引用符の間に貼り付けたい場合は 引用符で囲む を解除してください。ただしその形は元に戻せません。

使う前にお読みください

引用符のエスケープは、SQLインジェクションへの防御ではありません。 構文上の補助であって、セキュリティ境界ではありません。ユーザー、リクエスト、ファイル、他システムのいずれかから来た値は、パラメータ化クエリに置くべきものです。ドライバがプレースホルダーに値を別途バインドするため、値が文のテキストの一部になることはなく、どれだけ引用符を工夫してもクエリの意味を変えることはできません。

このツールが想定しているのはもう一方の場合です。マイグレーション、テストデータ、その場限りの SELECT に自分で書き込むリテラルで、テキストにアポストロフィが含まれており、引用符を数えずに正しい形が欲しいときです。

方言についての注意

ANSIの規則は最も安全な共通項ですが、普遍的ではありません。MySQLは NO_BACKSLASH_ESCAPES を有効にして動作していない限り、リテラル内で \ もエスケープ文字として扱います。したがってバックスラッシュで終わる値は、引用符の二重化だけでは完全には扱いきれません。手書きSQL以外の用途でこれに頼る前に、お使いの方言を確認してください。

プライバシー

すべての処理はブラウザ内のJavaScriptだけで完結します。データがアップロードされることはないため、機密情報でも安心して利用でき、オフラインでも動作します。

よくある質問

これでSQLインジェクションを防げますか?
いいえ。その目的で使ってはいけません。引用符のエスケープはセキュリティ境界ではありません。唯一信頼できる防御はパラメータ化クエリであり、そこでは値が文のテキストの一部になることが決してありません。このツールは自分で手書きするSQLのために使い、ユーザー入力から組み立てるSQLには使わないでください。
なぜシングルクォートだけが二重化されるのですか?
ANSI標準がそう定めているからです。標準SQLでは文字列リテラルはシングルクォートで区切られ、内側のシングルクォートは2回書きます。バックスラッシュによるエスケープは存在しません。
MySQLではこれで十分ですか?
必ずしもそうではありません。NO_BACKSLASH_ESCAPES が有効でない限り、MySQLは文字列リテラル内でバックスラッシュもエスケープ文字として扱うため、末尾のバックスラッシュが直後の引用符の読み方を変えてしまうことがあります。このツールが適用するのはANSIの規則のみです。
なぜ出力に外側の引用符が含まれるのですか。
それがリテラル全体であり、往復に耐える唯一の形だからです。囲まずにエスケープした単独のシングルクォートは `''` になり、引用符で囲まれた空文字列と区別がつきません。内側だけが必要なら **引用符で囲む** を解除してください。

関連ツール