MySQL 8.0 リファレンスマニュアル MySQL NDB Cluster 8.0 を含む

このページは機械翻訳したものです。

10.3.6 文字列リテラルの文字セットおよび照合順序

各文字列リテラルには文字セットと照合順序があります。

単純なステートメント 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 は、次の方法で文字列リテラルの文字セットおよび照合順序を決定します:

例:

イントロデューサは、次の文字列の文字セットを示しますが、パーサーが文字列内でエスケープ処理を実行する方法は変更しません。 エスケープは常に、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 が続きます。 エスケープシーケンスは、latin1character_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_connectionsjis で、àの順序の後に\ (16 進数値 05 および 5C) が続く文字セットは有効なマルチバイト文字です。 したがって、文字列の最初の 2 バイトは、単一の sjis 文字として解釈され、\はエスケープ文字として解釈されません。 次の n (16 進数値 6E) は、エスケープシーケンスであるため、解釈されません。 これは、2 つ目の文字列にも当てはまります。_latin1 イントロデューサはエスケープ処理に影響しません。