SQLのエスケープ文字についてまとめてます。
SQLのエスケープ文字の扱いは、DBMSごとに差異あり
MySQLのエスケープ文字一覧
MySQL :: MySQL 5.6 リファレンスマニュアル :: 9.1.1 文字列リテラル
- \0 ASCII ヌル (0x00) 文字。
- \’ 単一引用符 (「’」) 文字。
- \” 二重引用符 (「”」) 文字。
- \b バックスペース文字。
- \n 改行 (ラインフィード) 文字。
- \r 復帰改行文字。
- \t タブ文字。
- \Z ASCII 26 (Ctrl+Z)。
- \\ バックスラッシュ (「\」) 文字。
- \% 「%」文字。
- \_ 「_」文字。
Oracleのエスケープ文字一覧
{} … 中カッコを使用して、文字または記号の文字列をエスケープします。中カッコで囲まれたものが、エスケープ・シーケンスの部分とみなされます。
中カッコを使用して単一の文字をエスケープすると、エスケープされた文字が問合せ内の別のトークンになります。
\ … 円記号を使用して、単一の文字または記号をエスケープします。円記号の直後の文字のみがエスケープされます。たとえば、blue\-greenという問合せには、blue-greenおよびblue greenが一致します。
sql エスケープ文字 一覧(SQLServer)
- 引用符 (“) \”
- 逆斜線 (\) \\
- 斜線 (/) \/
- バックスペース \b
- フォーム フィード \f
- 改行 \n
- キャリッジ リターン \r
- 水平タブ \t
- CHAR(0) \u0000
- CHAR(1) \u0001
… … - CHAR(31) \u001f
STRING_ESCAPE (Transact-SQL) – SQL Server | Microsoft Docs
SQL エスケープ文字 一覧(PostgreSQL)
- \b バックスペース
- \f 改ページ
- \n 改行
- \r 復帰
- \t タブ
- \o, \oo, \ooo (o = 0 – 7) 8進数バイト値
- \xh, \xhh (h = 0 – 9, A – F) 16進数バイト値
- \uxxxx, \Uxxxxxxxx (x = 0 – 9, A – F) 16もしくは32ビットの16進数 Unicode 文字値
バックスラッシュ以外のエスケープ文字は、UESCAPEまたはESCAPEで指定可能です。UESCAPEはunicode向けのエスケープ文字指定です。
U&'d!0061t!+000061' UESCAPE '!'
SQLで特殊文字のエスケープ
SQL シングルクォーテーションのエスケープ
SQLでは、文字列を扱う場合にシングルクォート(「’」)を使います。文字列中にそのままシングルクォートを使うと、データベースエンジンが文字列の終端を誤認識するため、Syntaxエラーとなります。
以下はMySQLで実行した例です。
select 'Today's Wheather'; You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'Wheather'' at line 1
シングルクォートをエスケープするには、シングルクォートを2つ記述(「”」)します。
select 'Today''s Wheather'; Today's Wheather ----------- Today's Wheather
SQL ダブルクォーテーションのエスケープ
PostgreSQLなどの標準SQLは、シングルクォートで囲まれた文字列は文字列定数、ダブルクォートで囲まれた文字列はカラム名として扱います。そのため、シングルクォートで囲まれた文字列中にダブルクォートが含まれていても問題なく処理されます。
#PostgreSQLで実行 select 'double quote="' as col1 col1 ----- double quote=" #ダブルクォートで囲むとカラム扱いになるためエラー select "test" as col1 ERROR: column "test" does not exist Position: 8
ただし、MySQLは、シングルクォートもダブルクォートも文字列定数として扱うんですね。このため、場合によってはダブルクォートをエスケープする必要が出てきます。
#MySQLでは、シングルクォートもダブルクォートも文字列定数 select 'test' as col1; col1 ----- test select "test" as col1; col1 ----- test
ダブルクォートをエスケープするには、ダブルクォートを2つ重ねて記述(「””」)します。また、MySQLではダブルクォートの前にバックスラッシュ(日本語環境では円記号)を記述してエスケープすることも可能です。
#MySQLで実行 select "double quote=""" as col1; col1 ----- double quote=" select "double quote=\"" as col1; col1 ----- double quote="
SQL バックスラッシュのエスケープ
MySQLなど、一部のデータベースエンジンでは特殊文字の前にバックスラッシュ(日本語環境では円記号)「\」を記述することでエスケープが可能です。
しかし、主要なデータベースエンジンOracle、PostgreSQL、SQL Serverではバックスラッシュによる特殊文字エスケープはエラーとなります。
Oracleでは、文字列の終端を誤認識し、「FROMがない」というエラーが出力されました。
#Oracleで実行 select 'Today\'s Wheather' from dual; ORA-00923: FROM keyword not found where expected
SQLServerでは、シングルクォートが閉じられていない、というエラーが出力されました。
#SQL Serverで実行 select 'Today\'s Wheather'; Invalid SQL statement or JDBC escape, terminating ''' not found.
PostgreSQLでは、文字列の終端が見つからないというエラーが出力されました。
#PostgreSQLで実行 select 'Today\'s Wheather'; Unterminated string literal started at position 25 in SQL select 'Today\'s Wheather'. Expected char
特殊文字をバックスラッシュでエスケープするのは、シェルスクリプトなどでおなじみの方法ですが、SQLでは特殊な環境以外では使えないと考えたほうが良さそうです。
ESCAPE句を使って、エスケープ文字を指定するようにしましょう。
【関連記事】
▶SQLのescapeはエスケープ文字を指定 エスケープ指定は各DBで異なる
まとめ
- シングルクォートのエスケープは、シングルクォートを2つ重ねて記述(「”」)
- ダブルクォートのエスケープは、MySQLなど一部のDBMSで必要。2つ重ねて記述(「””」)
- バックスラッシュによる特殊文字エスケープは、MySQLなど一部のDBMSでのみ有効