文字列は、単一引用符
(‘'
’)または二重引用符
(‘"
’)で囲まれたバイトもしくは文字の並び(シーケンス)です。次に例を示します:
'a string' "another string"
ANSI_QUOTES
SQLモードで実行時は、文字列リテラルは単一引用符でのみ囲まれます。これは、二重引用符で引用された文字列は識別子として解釈されるためです。
バイナリ文字列はキャラクタセットや照合順序を持たないバイト列のことです。 バイナリでない文字列は、キャラクタセットや照合順序を持つ文字列のことです。これら両方の文字列タイプは、文字列ユニットの数値に基づいて比較されます。バイナリ文字列にとって、ユニットとはバイトのことです。バイナリでない文字列にとってユニットとは文字であり、マルチバイト文字を認めるキャラクタセットもあります。文字値の順序は、文字列照合順序の関数です。
文字列リテラルでは、オプションとしてキャラクタセットイントロデューサとCOLLATE
節を指定することができます。
[_charset_name
]'string
' [COLLATEcollation_name
]
例:
SELECT _latin1'string
'; SELECT _latin1'string
' COLLATE latin1_danish_ci;
これら文字列構文についてさらに詳しく知りたい場合は、次を参照してください。項9.3.5. 「文字列リテラルのキャラクタセットおよび照合順序」
一部のシーケンスは、個々の文字列内で特別な意味を持ちます。これらのシーケンスは、いずれも、エスケープ文字として知られるバックスラッシュ(‘\
’)で始まります。MySQLでは、次のエスケープシーケンスが認識されます。
他のすべてのエスケープシーケンスに対して、バックスラッシュは無視されます。つまり、エスケープされた文字がエスケープされていないと解釈されます。例えば、‘\x
’はただの‘x
’となります。
これらのシーケンスは大文字と小文字が区別されます。例えば、‘\b
’はバックスペースと解釈されますが、‘\B
’は‘B
’と解釈されます。
ASCII(26)‘\Z
’。この文字をコード化することによって、ASCII(26)
が Windows では END-OF-FILE
を表すという問題を回避することができます。ASCII(26)
では、mysql
.
を使用する場合に問題が発生します)。
db_name
<
file_name
エスケーププロセスはcharacter_set_connection
システム変数により指定されたキャラクタセットに応じて実行されます。で項9.3.5. 「文字列リテラルのキャラクタセットおよび照合順序」説明されたとおり、他キャラクタセットを指定するイントロデューサが先行する文字列に対しても同じことがいえます。
‘\%
’と‘\_
’シーケンスはパターン照合コンテキスト内で、本来であればワイルドカード文字として解釈されるシーケンス‘%
’と‘_
’のリテラル使用例を検索するのに使われます。項11.3.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 |
NUL ASCII
0、バイト。この文字は‘\0 ’
(バックスラッシュ+ASCII
‘0 ’文字)で表現します。 |
\ |
ASCII
92、バックスラッシュ。‘\\ ’として表現します。 |
' |
ASCII
39、単一引用符。‘\' ’として表現します。 |
" |
ASCII
34、二重引用符。‘\" ’として表現します。 |
アプリケーションプログラムを書く場合、 MySQLサーバに送信されるSQLステートメント内で文字がデータ値として使用される前に、これら特殊文字のいずれかを含む可能性のある文字列は正確にエスケープされなければなりません。二通りの実行方法があります。
特殊文字をエスケープする関数を使い文字列を処理してください。C
コードを書く場合は、文字をエスケープする目的で
C API
関数mysql_real_escape_string()
を使用できます。項23.2.3.53. 「mysql_real_escape_string()
」を参照してください。Perl
DBI インターフェースでは、quote
メソッドを使用して特殊文字を適切なエスケープシーケンスに変換することができます。
項23.4. 「MySQL Perl API」を参照してください。他の言語インターフェースでも同様の機能が利用できることがあります。
または、MySQL API の多くのものが一種のプレースホルダ機能を備えているため、この機能を使ってステートメント文字列に特殊なマーカーを挿入し、ステートメントの発行時にデータ値をそれらのマーカーにバインドすることもできます。この場合、値内の特殊文字のエスケープ処理が API によって自動で行われます。