MySQL 8.0 リファレンスマニュアル


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

9.1.1 文字列リテラル

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

'a string'
"another string"

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

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

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

バイナリ文字列はバイトの文字列です。 すべてのバイナリ文字列には、binary という名前の文字セットと照合順序があります。 非バイナリ文字列は文字列です。 binary 以外の文字セットと、文字セットと互換性のある照合順序があります。

これらの両方の文字列タイプは、文字列単位の数値に基づいて比較されます。 バイナリ文字列の場合、単位はバイトです。比較では数値バイト値が使用されます。 非バイナリ文字列の場合、単位は文字であり、一部の文字セットではマルチバイト文字がサポートされます。比較では数値文字コード値が使用されます。 文字コードの順序付けは、文字列照合の関数です。 (詳細はセクション10.8.5「バイナリ照合順序と_bin 照合順序」を参照してください。)

文字列リテラルには、特定の文字セットおよび照合順序を使用する文字列として指定するために、オプションの文字セットイントロデューサおよび COLLATE 句を含めることができます:

[_charset_name]'string' [COLLATE collation_name]

例:

SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_danish_ci;

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

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

これらの形式の文字列構文の詳細は、セクション10.3.7「各国語文字セット」 および セクション10.3.8「文字セットイントロデューサ」 を参照してください。

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

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

エスケープシーケンス シーケンスが表す文字
\0 ASCII NUL (X'00') 文字
\' 単一引用符 (') 文字
" 二重引用符 (") 文字
\b バックスペース文字
\n 改行 (ラインフィード) 文字
\r 復帰改行文字
\t タブ文字
\Z ASCII 26 (Control+Z):テーブルの後のノートを参照してください
\\ バックスラッシュ (\) 文字
\% % 文字。テーブルの後のノートを参照してください
\_ _文字。テーブルの後のノートを参照してください

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

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

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

  • 'で引用符で囲まれた文字列内の'は、''として記述できます。

  • "で引用符で囲まれた文字列内の"は、""として記述できます。

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

  • "で引用符で囲まれた文字列内の'は特別な処理を必要とせず、二重にしたりエスケープしたりする必要はありません。 同様に、'で引用符で囲まれた文字列内の"では、特別な処理は必要ありません。

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

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


関連キーワード:  文字, リテラル, エスケープ, セット, 順序, string, 参照, 照合, ステートメント, リファレンス