Documentation Home
MySQL 5.6 リファレンスマニュアル
Download this Manual
PDF (US Ltr) - 26.8Mb
PDF (A4) - 26.9Mb
HTML Download (TGZ) - 7.1Mb
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
User comments in this section are, as the name implies, provided by MySQL users. The MySQL documentation team is not responsible for, nor do they endorse, any of the information provided here.
Sign Up Login You must be logged in to post a comment.