Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 27.1Mb
PDF (A4) - 27.2Mb
HTML Download (TGZ) - 7.2Mb
HTML Download (Zip) - 7.2Mb


MySQL 5.6 リファレンスマニュアル  /  ...  /  文字列リテラル

9.1.1 文字列リテラル

文字列は、単一引用符 (') または二重引用符 (") で囲まれたバイトまたは文字のシーケンスです。例:

'a string'
"another string"

隣同士にある引用符付きの文字列は、1 つの文字列に連結されます。次の行は同等です。

'a string'
'a' ' ' 'string'

ANSI_QUOTES SQLモードを有効にしている場合は、二重引用符で囲んだ文字列は識別子として解釈されるため、文字列リテラルを囲む引用符には単一引用符だけを使用できます。

バイナリ文字列とは、文字セットや照合順序を持たないバイト文字列のことです。非バイナリ文字列とは、文字セットや照合順序を持つ文字列のことです。これらの両方の文字列タイプは、文字列単位の数値に基づいて比較されます。バイナリ文字列の場合、単位はバイトです。非バイナリ文字列の場合、単位は文字であり、マルチバイト文字をサポートする文字セットもあります。文字値の順序は、文字列照合順序の関数です。

文字列リテラルでは、オプションとして文字セットイントロデューサと COLLATE 句を指定できます。

[_charset_name]'string' [COLLATE collation_name]

例:

SELECT _latin1'string';
SELECT _latin1'string' COLLATE latin1_danish_ci;

N'literal' (または n'literal') を使用すると、各国文字セットの文字列を作成できます。次のステートメントは同等です。

SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';

これらの文字列構文の形式の詳細は、セクション10.1.3.5「文字列リテラルの文字セットおよび照合順序」およびセクション10.1.3.6「各国文字セット」を参照してください。

NO_BACKSLASH_ESCAPES SQL モードが有効になっている場合を除いて、一部のシーケンスが文字列内で特別な意味を持ちます。これらのシーケンスはいずれも、エスケープ文字として知られるバックスラッシュ (\) で始まります。MySQL は、表9.1「特殊文字エスケープシーケンス」に示すエスケープシーケンスを認識します。ほかのすべてのエスケープシーケンスでは、バックスラッシュは無視されます。つまり、エスケープされた文字がエスケープされていないと解釈されます。たとえば、\xは単なるxです。これらのシーケンスでは大文字と小文字が区別されます。たとえば、\bはバックスペースと解釈されますが、\BBと解釈されます。エスケープ処理は character_set_connection システム変数で指定された文字セットに応じて実行されます。セクション10.1.3.5「文字列リテラルの文字セットおよび照合順序」で説明するとおり、ほかの文字セットを示すイントロデューサが前に置かれている文字列についても同じことがいえます。

表 9.1 特殊文字エスケープシーケンス

エスケープシーケンス シーケンスが表す文字
\0 ASCII NUL (0x00) 文字。
\' 単一引用符 (') 文字。
\" 二重引用符 (") 文字。
\b バックスペース文字。
\n 改行 (ラインフィード) 文字。
\r 復帰改行文字。
\t タブ文字。
\Z ASCII 26 (Ctrl+Z)。表に続いて記されている注釈を参照してください。
\\ バックスラッシュ (\) 文字。
\% %文字。表に続いて記されている注釈を参照してください。
\_ _文字。表に続いて記されている注釈を参照してください。

ASCII 26 文字を\Zとしてエンコードすると、Windows で ASCII 26 が END-OF-FILE を表すという問題を回避できます。mysql db_name < file_name を使用しようとすると、ファイル内の ASCII 26 が問題を引き起こします。

\%および\_シーケンスは、パターンマッチングコンテキストでリテラルインスタンス % および _ を検索するために使用されます (パターンマッチングコンテキスト以外ではワイルドカード文字として解釈される)。セクション12.5.1「文字列比較関数」内の LIKE 演算子に関する記述を参照してください。パターンマッチングコンテキスト以外で\%または\_を使用すると、%_ではなく、文字列\%\_として評価されます。

文字列に引用符を含める方法は、いくつかあります。

  • 'で囲んだ文字列内で'を使用する場合は、''と記述します。

  • "で囲んだ文字列内で"を使用する場合は、""と記述します。

  • 引用符文字の直前にエスケープ文字 (\) を指定します。

  • "で囲んだ文字列内で'を使用する場合、引用符を 2 つ続けて入力したり、エスケープしたりなどの特別な処理は必要はありません。同様に、'で囲んだ文字列内で"を使用する場合も、特別な処理は必要ありません。

次の SELECT ステートメントは、引用符を使用した場合とエスケープを使用した場合にどのような効果があるかを示しています。

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+

mysql> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+

文字列カラム (BLOB カラムなど) にバイナリデータを挿入する場合、ある種の文字はエスケープシーケンスで表現してください。バックスラッシュ (\) と、文字列を囲む引用符は、エスケープする必要があります。ある種のクライアント環境では、NUL や Ctrl+Z もエスケープする必要があります。mysql クライアントは、NUL 文字がエスケープされていない場合、これを含む引用符付きの文字列を切り捨てます。Ctrl+Z は、エスケープされていない場合、Windows で END-OF-FILE を表すと見なされる可能性があります。これらのそれぞれの文字を表すエスケープシーケンスについては、表9.1「特殊文字エスケープシーケンス」を参照してください。

アプリケーションプログラムを書く場合、MySQL Server に送信される SQL ステートメント内で文字列がデータ値として使用される前に、これらの特殊文字を含む可能性のある文字列は適切にエスケープする必要があります。これには次の 2 つの方法があります。

  • 特殊文字をエスケープする関数を使用して文字列を処理します。C プログラムでは、C API 関数 mysql_real_escape_string() を使用して、文字をエスケープできます。セクション23.8.7.54「mysql_real_escape_string()」を参照してください。ほかの SQL ステートメントを構成する SQL ステートメント内では、QUOTE() 関数を使用できます。Perl DBI インタフェースでは、quote メソッドを使用して特殊文字を適切なエスケープシーケンスに変換できます。セクション23.10「MySQL Perl API」を参照してください。ほかの言語インタフェースでも同様の機能を利用できることがあります。

  • 特殊文字を明示的にエスケープする方法以外に、多くの MySQL API には、ステートメント文字列に特殊なマーカーを挿入し、ステートメントの発行時にデータ値をそれらのマーカーにバインドできるプレースホルダー機能が備わっています。この場合、値内の特殊文字のエスケープ処理は API によって自動で行われます。


User Comments
Sign Up Login You must be logged in to post a comment.