Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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が一致します。

関連)Oracle Text問合せの特殊文字

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 文字値

関連)PostgreSQL公式:4.1. 字句の構造

バックスラッシュ以外のエスケープ文字は、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でのみ有効

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。