文字列は、単一引用符
(「'」)
または二重引用符
(「"」)
で囲まれたバイトまたは文字の並び
(シーケンス) です。次に例を示します。
'a string' "another string"
隣同士にある引用符付きの文字列は、1 つの文字列に連結されます。次の行は同じです。
'a string' 'a' ' ' 'string'
ANSI_QUOTES
SQL
モードで実行時は、文字列リテラルは単一引用符でのみ囲まれます。これは、二重引用符で引用された文字列は識別子として解釈されるためです。
バイナリ列はキャラクタセットや照合順序を持たないバイト列のことです。非バイナリ列は、キャラクタセットや照合順序を持つ文字列のことです。これら両方の文字列タイプは、文字列ユニットの数値に基づいて比較されます。バイナリ列の場合、単位はバイトです。非バイナリ列の場合、単位は文字であり、マルチバイト文字が許されるキャラクタセットもあります。文字値の順序は、文字列照合順序の関数です。
文字列リテラルでは、オプションとしてキャラクタセットイントロデューサと
COLLATE
節を指定することができます。
[_charset_name]'string' [COLLATEcollation_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';
これらの文字列構文の形式の詳細は、Character String Literal Character Set and CollationおよびNational Character Setを参照してください。
NO_BACKSLASH_ESCAPES
SQL
モードが有効になっていないかぎり、一部のシーケンスは文字列内で特別な意味を持ちます。これらのシーケンスは、いずれも、エスケープ文字として知られるバックスラッシュ(「\」)で始まります。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
システム変数により指定されたキャラクタセットに応じて実行されます。Character String Literal Character Set and Collationで説明したとおり、ほかのキャラクタセットを指定するイントロデューサが先行する文字列に対しても同じことがいえます。
「\%」 および
「\_」
シーケンスは、「%」
と 「_」
をそのまま使用したときにワイルドカード文字として解釈されるパターンマッチングコンテキストで、それぞれのリテラルインスタンスを検索するために使用されます。項7.4.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 |
NUL バイト
(0x00)。この文字は
「\0」
(バックスラッシュ + ASCII
「0」
文字) で表現します。 |
\ |
ASCII 92、バックスラッシュ。この文字は
「\\」
で表現します。 |
' |
ASCII 39、単一引用符。この文字は
「\'」
で表現します。 |
" |
ASCII 34、二重引用符。この文字は
「\"」
で表現します。 |
アプリケーションプログラムを書く場合、MySQL サーバーに送信される SQL ステートメント内で文字がデータ値として使用される前に、これら特殊文字のいずれかを含む可能性のある文字列は正確にエスケープされなければなりません。二通りの実行方法があります。
特殊文字をエスケープする関数を使い文字列を処理してください。C
コードを書く場合は、文字をエスケープする目的で
C API 関数
mysql_real_escape_string()
を使用できます。詳しくはmysql_real_escape_string()を参照してください。Perl
DBI インタフェースでは、quote
メソッドを使用して特殊文字を適切なエスケープシーケンスに変換することができます。詳しくはMySQL Perl APIを参照してください。ほかの言語インタフェースでも同様の機能が利用できることがあります。
または、MySQL API の多くのものが一種のプレースホルダ機能を備えているため、この機能を使ってステートメント文字列に特殊なマーカーを挿入し、ステートメントの発行時にデータ値をそれらのマーカーにバインドすることもできます。この場合、値内の特殊文字のエスケープ処理が API によって自動で行われます。
