piapia123
ja

SQL 識別子の引用符

テキスト

処理はすべてブラウザ内で完結します。データは送信されません

入力
ファイルをここにドロップすると読み込めます
出力

用途は 2 つあり、それぞれ実際の場面に対応します。 引用符を付ける:MySQL 風の SQL を Postgres / Oracle へ移すときです。MySQL の識別子は既定で大文字小文字を区別しませんが、Postgres は引用符のない識別子を小文字に畳みます —— `userID` という列は `userid` になって「列が存在しません」で落ちます。元の大文字小文字を保つには二重引用符が要ります。 引用符を外す:Postgres が出力した `"users"` や `"userID"` を裸の識別子に戻します。読みやすくなり、引用符を嫌う古いツールにもそのまま貼れます。 ⚠️ 最も重要な規則:文字列リテラルとコメントの中身には 1 文字も触れません。 「単語を全部引用符で囲む」素朴な実装は `INSERT INTO t VALUES ('active')` を `'"active"'` にします —— データに引用符が 2 つ増え、しかも文はそのまま実行できてしまうため、気付くのはデータを読むときです。そこで小さなスキャナーを使い、文字列・コメント・既に引用された識別子はまるごと飛ばします。 外せない引用符は残します。 `"user id"`(空白入り)、`"order"`(予約語)、`"2fa"`(数字始まり)はいずれも裸では不正な識別子です。この場合は引用符を残し、件数を報告します。実行できない SQL を出すよりはるかにましだからです。

機能

  • テーブル名・列名・別名などの識別子に二重引用符を一括で付与
  • 既存の二重引用符とバッククォートを除去(バッククォートは 3 社が認める二重引用符に統一)
  • ⚠️ 文字列リテラルの中身には 1 文字も触れません(`''` エスケープも含む)
  • `--` 行コメントと `/* */` ブロックコメントの中身にも触れません
  • SQL の予約語には引用符を付けません(`select` に付けると列名になってしまいます)
  • 非 ASCII の識別子にも引用符を付けます(中国語のテーブル名も保たれます)
  • 除去時に裸で書けない名前は引用符を残し、件数を報告します
  • 行ごとにコピーでき、説明文がコピー内容に混ざりません

使い方

  1. SQL を貼り付けます
  2. 「二重引用符を付ける」か「外す」を選びます
  3. 結果は即座に更新されます。コピーして取り出してください

よくある質問

文字列の中身は変更されませんか?
変更しません。これがこのツールで最も重要な規則です。`INSERT INTO t VALUES ('active')` の `active` はデータであって識別子ではありません。引用符を付けると `'"active"'` になり、増えた 2 つの引用符は実際にデータベースへ保存されます。しかも文はそのまま実行できるため、問題が分かるのはデータを読み出すときです。コメントも同じ理由でまるごと飛ばします。
予約語に引用符を付けないのはなぜですか?
`select` に引用符を付けると、予約語から `select` という名前の列名に変わってしまい、文の意味がその場で変わるからです。一般的な予約語は内蔵の表に入れてあり、そこにない珍しい語に付けた場合は「列が存在しません」で即座に失敗します —— 黙って意味が変わることはありません。
除去しても外れない引用符があるのはなぜですか?
外すと名前が不正になるからです。3 つの場合があります:空白や特殊文字を含む(`"user id"` は 2 語に割れる)、予約語(`"order"` は `ORDER BY` と衝突する)、数字始まり(`"2fa"` は有効な識別子ではない)。この場合は引用符を残し、該当する名前が何個あったかを知らせます。実行できない SQL を出すより、引用符が数個残るほうがはるかにましです。

関連ツール