各文字列リテラルには文字セットと照合順序があります。
単純なステートメント SELECT '
の場合、文字列には、string
'character_set_connection
および collation_connection
システム変数によって定義された接続のデフォルトの文字セットと照合順序が含まれます。
文字列リテラルには、特定の文字セットおよび照合順序を使用する文字列として指定するために、オプションの文字セットイントロデューサおよび COLLATE
句を含めることができます:
[_charset_name]'string' [COLLATE collation_name]
_
式は正式にはイントロデューサと呼ばれます。 パーサーに「「後続の文字列が文字セット charset_name
charset_name
を使用する」」ことを通知します。 イントロデューサは、CONVERT()
のように文字列をイントロデューサ文字セットに変更しません。 パディングは発生する可能性がありますが、文字列値は変更されません。 イントロデューサは単なる信号です。 セクション10.3.8「文字セットイントロデューサ」を参照してください。
例:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
文字セットイントロデューサと COLLATE
句は、標準 SQL 仕様に基づいて実装されています。
MySQL は、次の方法で文字列リテラルの文字セットおよび照合順序を決定します:
_charset_name
とCOLLATE
の両方が指定されている場合、文字セットcollation_name
charset_name
と照合順序collation_name
が使用されます。collation_name
は、charset_name
に対して許可された照合である必要があります。_charset_name
が指定されているが、COLLATE
が指定されていない場合は、文字セットcharset_name
とそのデフォルトの照合順序が使用されます。 各文字セットのデフォルトの照合順序を確認するには、SHOW CHARACTER SET
ステートメントを使用するか、INFORMATION_SCHEMA
CHARACTER_SETS
テーブルをクエリーします。_charset_name
は指定されていないが、COLLATE
が指定されている場合は、collation_name
character_set_connection
システム変数および照合collation_name
によって指定された接続のデフォルト文字セットが使用されます。collation_name
は、接続のデフォルト文字セットに対して許可された照合順序である必要があります。それ以外の場合 (
_charset_name
もCOLLATE
も指定されていない場合)、collation_name
character_set_connection
およびcollation_connection
システム変数によって指定された接続のデフォルトの文字セットと照合順序が使用されます。
例:
-
latin1
文字セットとlatin1_german1_ci
照合順序を持つ非バイナリ文字列:SELECT _latin1'Müller' COLLATE latin1_german1_ci;
-
utf8mb4
文字セットとそのデフォルトの照合順序 (つまり、utf8mb4_general_ci
) を持つ非バイナリ文字列:SELECT _utf8mb4'Müller';
-
binary
文字セットとそのデフォルト照合順序 (binary
) を持つバイナリ文字列:SELECT _binary'Müller';
-
接続のデフォルト文字セットおよび
utf8mb4_general_ci
照合順序を持つ非バイナリ文字列 (接続文字セットがutf8mb4
でない場合は失敗します):SELECT 'Müller' COLLATE utf8mb4_general_ci;
-
文字列に接続デフォルト文字セットおよび照合順序が指定されている場合
SELECT 'Müller';
イントロデューサは、次の文字列の文字セットを示しますが、パーサーが文字列内でエスケープ処理を実行する方法は変更しません。 エスケープは常に、character_set_connection
で指定された文字セットに従ってパーサーが解釈します。
次の例は、イントロデューサが存在する場合でも、character_set_connection
を使用して、エスケープ処理が行われることを示します。 例では、SET NAMES
(セクション10.4「接続文字セットおよび照合順序」で説明しているように、character_set_connection
を変更します) を使用し、正確な文字列の内容を確認できるように HEX()
関数を使用して結果の文字列を表示します。
例 1:
mysql> SET NAMES latin1;
mysql> SELECT HEX('à\n'), HEX(_sjis'à\n');
+------------+-----------------+
| HEX('à\n') | HEX(_sjis'à\n') |
+------------+-----------------+
| E00A | E00A |
+------------+-----------------+
ここでは、à
(16 進数値 E0
) の後に、改行のエスケープシーケンスである\n
が続きます。 エスケープシーケンスは、latin1
の character_set_connection
値を使用して解釈され、リテラル改行 (16 進数値 0A
) が生成されます。 これは 2 番目の文字列にも行われます。 つまり、_sjis
イントロデューサはパーサーエスケープ処理には影響しません。
例 2:
mysql> SET NAMES sjis;
mysql> SELECT HEX('à\n'), HEX(_latin1'à\n');
+------------+-------------------+
| HEX('à\n') | HEX(_latin1'à\n') |
+------------+-------------------+
| E05C6E | E05C6E |
+------------+-------------------+
ここで、character_set_connection
は sjis
で、à
の順序の後に\
(16 進数値 05
および 5C
) が続く文字セットは有効なマルチバイト文字です。 したがって、文字列の最初の 2 バイトは、単一の sjis
文字として解釈され、\
はエスケープ文字として解釈されません。 次の n
(16 進数値 6E
) は、エスケープシーケンスであるため、解釈されません。 これは、2 つ目の文字列にも当てはまります。_latin1
イントロデューサはエスケープ処理に影響しません。