文字列リテラル、16 進リテラルまたはビット値リテラルには、特定の文字セットおよび照合順序を使用する文字列として指定するために、オプションの文字セットイントロデューサおよび COLLATE
句を指定できます:
[_charset_name] literal [COLLATE collation_name]
_
式は正式にはイントロデューサと呼ばれます。 パーサーに「「後続の文字列が文字セット charset_name
charset_name
を使用する」」ことを通知します。 イントロデューサは、CONVERT()
のように文字列をイントロデューサ文字セットに変更しません。 パディングは発生する可能性がありますが、文字列値は変更されません。 イントロデューサは単なる信号です。
文字列リテラルの場合、イントロデューサと文字列の間の空白は許可されますが、オプションです。
文字セットリテラルの場合、イントロデューサは次の文字列の文字セットを示しますが、パーサーが文字列内でエスケープ処理を実行する方法は変更しません。 エスケープは常に、character_set_connection
で指定された文字セットに従ってパーサーが解釈します。 その他の説明と例については、セクション10.3.6「文字列リテラルの文字セットおよび照合順序」 を参照してください。
例:
SELECT 'abc';
SELECT _latin1'abc';
SELECT _binary'abc';
SELECT _utf8mb4'abc' COLLATE utf8mb4_danish_ci;
SELECT _latin1 X'4D7953514C';
SELECT _utf8mb4 0x4D7953514C COLLATE utf8mb4_danish_ci;
SELECT _latin1 b'1000001';
SELECT _utf8mb4 0b1000001 COLLATE utf8mb4_danish_ci;
文字セットイントロデューサと COLLATE
句は、標準 SQL 仕様に基づいて実装されています。
文字列リテラルは、_binary
イントロデューサを使用してバイナリ文字列として指定できます。 16 進数リテラルおよびビット値リテラルはデフォルトでバイナリ文字列であるため、_binary
は許可されますが、通常は不要です。_binary
は、16 進数リテラルまたはビットリテラルをバイナリ文字列として保持し、それ以外の場合はリテラルを数値として処理する場合に役立ちます。 たとえば、ビット操作では、MySQL 8.0 以上で数値またはバイナリ文字列引数が許可されますが、デフォルトでは 16 進数リテラルおよびビットリテラルは数値として扱われます。 このようなリテラルのバイナリ文字列コンテキストを明示的に指定するには、少なくとも次のいずれかの引数に_binary
イントロデューサを使用します:
mysql> SET @v1 = X'000D' | X'0BC0';
mysql> SET @v2 = _binary X'000D' | X'0BC0';
mysql> SELECT HEX(@v1), HEX(@v2);
+----------+----------+
| HEX(@v1) | HEX(@v2) |
+----------+----------+
| BCD | 0BCD |
+----------+----------+
両方のビット操作で表示される結果は似ていますが、_binary
のない結果は BIGINT
値ですが、_binary
の結果はバイナリ文字列です。 結果タイプが異なるため、表示される値は異なります: 数値の結果には、上位 0 桁は表示されません。
MySQL は、文字列リテラル、16 進リテラルまたはビット値リテラルの文字セットおよび照合順序を次の方法で決定します:
_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
は、接続のデフォルト文字セットに対して許可された照合順序である必要があります。16 進数リテラルまたはビット値リテラルの場合、これらのタイプのリテラルはデフォルトでバイナリ文字列であるため、許可される照合は
binary
のみです。
-
それ以外の場合 (
_charset_name
もCOLLATE
も指定されていません):collation_name
文字列リテラルの場合は、接続のデフォルトの文字セットと、
character_set_connection
およびcollation_connection
システム変数によって指定された照合順序が使用されます。16 進リテラルまたはビット値リテラルの場合、文字セットおよび照合順序は
binary
です。
例:
-
latin1
文字セットとlatin1_german1_ci
照合順序を持つ非バイナリ文字列:SELECT _latin1'Müller' COLLATE latin1_german1_ci; SELECT _latin1 X'0A0D' COLLATE latin1_german1_ci; SELECT _latin1 b'0110' COLLATE latin1_german1_ci;
-
utf8mb4
文字セットとそのデフォルト照合順序 (つまり、utf8mb4_0900_ai_ci
) を持つ非バイナリ文字列:SELECT _utf8mb4'Müller'; SELECT _utf8mb4 X'0A0D'; SELECT _utf8mb4 b'0110';
-
binary
文字セットとそのデフォルト照合順序 (binary
) を持つバイナリ文字列:SELECT _binary'Müller'; SELECT X'0A0D'; SELECT b'0110';
16 進リテラルおよびビット値リテラルはデフォルトでバイナリ文字列であるため、導入者は必要ありません。
-
接続のデフォルト文字セットおよび
utf8mb4_general_ci
照合順序を持つ非バイナリ文字列 (接続文字セットがutf8mb4
でない場合は失敗します):SELECT 'Müller' COLLATE utf8mb4_general_ci;
この構成 (
COLLATE
のみ) は 16 進数リテラルまたはビットリテラルでは機能しません。接続文字セットに関係なく、binary
はutf8mb4_general_ci
照合と互換性がないためです。 イントロデューサがない場合に許可されるCOLLATE
句は、COLLATE binary
のみです。 -
文字列に接続デフォルト文字セットおよび照合順序が指定されている場合
SELECT 'Müller';