MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  バイナリ照合順序と_bin 照合順序

10.8.5 バイナリ照合順序と_bin 照合順序

このセクションでは、バイナリ文字列の binary 照合順序を非バイナリ文字列の_bin 照合順序と比較する方法について説明します。

バイナリ文字列 (BINARYVARBINARY および BLOB データ型を使用して格納される) には、binary という名前の文字セットと照合順序があります。 バイナリ文字列はバイトのシーケンスであり、それらのバイトの数値によって比較およびソート順序が決まります。 セクション10.10.8「バイナリ文字セット」を参照してください。

(CHARVARCHAR および TEXT データ型を使用して格納された) 非バイナリ文字列には、binary 以外の文字セットおよび照合順序があります。 特定の非バイナリ文字セットには複数の照合順序を含めることができ、それぞれがセット内の文字の特定の比較順序およびソート順序を定義します。 ほとんどの文字セットでは、これらのいずれかがバイナリ照合順序で、照合順序名に_bin 接尾辞が付いています。 たとえば、utf8 および latin1 のバイナリ照合は、utf8_bin および latin1_bin という名前です。utf8mb4 は、utf8mb4_binutf8mb4_0900_bin の 2 つのバイナリ照合順序を持つ例外です。セクション10.10.1「Unicode 文字セット」 を参照してください。

binary 照合は、次の各セクションで説明するように、いくつかの点で_bin 照合と異なります:

比較およびソートの単位

バイナリ文字列は、バイトのシーケンスです。 binary 照合の場合、比較およびソートは数値バイト値に基づきます。 非バイナリ文字列は文字のシーケンスであり、これはマルチバイトであることもあります。 非バイナリ文字列の照合順序は、比較およびソートのための文字値の順序を定義します。 _bin 照合順序では、この順序付けは数値文字コード値に基づきます。これは、文字コード値がマルチバイトであることを除き、バイナリ文字列の順序付けに似ています。

文字セット変換

非バイナリ文字列には文字セットがあり、多くの場合、文字列に_bin 照合順序がある場合でも自動的に別の文字セットに変換されます:

  • 異なる文字セットを持つ別のカラムにカラム値を割り当てる場合:

    UPDATE t1 SET utf8_bin_column=latin1_column;
    INSERT INTO t1 (latin1_column) SELECT utf8_bin_column FROM t2;
  • 文字列リテラルを使用して、INSERT または UPDATE のカラム値を割り当てる場合:

    SET NAMES latin1;
    INSERT INTO t1 (utf8_bin_column) VALUES ('string-in-latin1');
  • サーバーからクライアントに結果を送信する場合:

    SET NAMES latin1;
    SELECT utf8_bin_column FROM t2;

バイナリ文字列カラムの場合、変換は行われません。 前述のような場合は、文字列値がバイト単位でコピーされます。

大文字小文字変換

非バイナリ文字セットの照合順序は、文字の大文字と小文字に関する情報を提供するため、順序付けで大文字と小文字を無視する_bin 照合順序の場合でも、非バイナリ文字列の文字をある大文字から別の文字に変換できます:

mysql> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
mysql> SELECT LOWER('aA'), UPPER('zZ');
+-------------+-------------+
| LOWER('aA') | UPPER('zZ') |
+-------------+-------------+
| aa          | ZZ          |
+-------------+-------------+

大文字と小文字という概念は、バイナリ文字列内のバイトには適用されません。 大文字と小文字の変換を実行するには、まず文字列に格納されているデータに適した文字セットを使用して、文字列を非バイナリ文字列に変換する必要があります:

mysql> SET NAMES binary;
mysql> SELECT LOWER('aA'), LOWER(CONVERT('aA' USING utf8mb4));
+-------------+------------------------------------+
| LOWER('aA') | LOWER(CONVERT('aA' USING utf8mb4)) |
+-------------+------------------------------------+
| aA          | aa                                 |
+-------------+------------------------------------+

比較での後続領域の処理

MySQL 照合には、PAD SPACE または NO PAD の値を持つ pad 属性があります:

  • ほとんどの MySQL 照合には、PAD SPACE のパッド属性があります。

  • UCA 9.0.0 以上に基づく Unicode 照合には、NO PAD のパッド属性があります。セクション10.10.1「Unicode 文字セット」 を参照してください。

非バイナリ文字列 (CHARVARCHAR および TEXT 値) の場合、文字列照合パッド属性によって、文字列の末尾にある末尾の空白の比較での処理が決まります:

  • PAD SPACE 照合の場合、末尾のスペースは比較では重要ではありません。文字列は末尾のスペースに関係なく比較されます。

  • NO PAD 照合順序では、他の文字と同様に、比較で末尾のスペースが重要として扱われます。

異なる動作を示すには、いずれか一方が PAD SPACE で、もう一方が NO PADutf8mb4 バイナリ照合を使用します。 この例では、INFORMATION_SCHEMA COLLATIONS テーブルを使用して照合のパッド属性を決定する方法も示します。

mysql> SELECT COLLATION_NAME, PAD_ATTRIBUTE
       FROM INFORMATION_SCHEMA.COLLATIONS
       WHERE COLLATION_NAME LIKE 'utf8mb4%bin';
+------------------+---------------+
| COLLATION_NAME   | PAD_ATTRIBUTE |
+------------------+---------------+
| utf8mb4_bin      | PAD SPACE     |
| utf8mb4_0900_bin | NO PAD        |
+------------------+---------------+
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_bin;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          1 |
+------------+
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_0900_bin;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          0 |
+------------+
注記

このコンテキストの「比較」には、LIKE パターン一致演算子は含まれていません。この演算子の末尾の空白は、照合に関係なく重要です。

バイナリ文字列 (BINARYVARBINARY および BLOB の値) の場合、後続の空白を含むすべてのバイトが比較で意味を持ちます:

mysql> SET NAMES binary;
mysql> SELECT 'a ' = 'a';
+------------+
| 'a ' = 'a' |
+------------+
|          0 |
+------------+

挿入および取得のための後続領域処理

CHAR(N) カラムには、バイナリ以外の文字列の N 文字の長さが格納されます。 挿入の場合、N 文字より短い値はスペースで拡張されます。 取得の場合、末尾の空白は削除されます。

BINARY(N) カラムには、バイナリ文字列の N バイト長が格納されます。 挿入の場合、N バイトより短い値は 0x00 バイトで拡張されます。 取得の場合、何も削除されません。宣言された長さの値が常に返されます。

mysql> CREATE TABLE t1 (
         a CHAR(10) CHARACTER SET utf8 COLLATE utf8_bin,
         b BINARY(10)
       );
mysql> INSERT INTO t1 VALUES ('x','x');
mysql> INSERT INTO t1 VALUES ('x ','x ');
mysql> SELECT a, b, HEX(a), HEX(b) FROM t1;
+------+------------+--------+----------------------+
| a    | b          | HEX(a) | HEX(b)               |
+------+------------+--------+----------------------+
| x    | x          | 78     | 78000000000000000000 |
| x    | x          | 78     | 78200000000000000000 |
+------+------------+--------+----------------------+

関連キーワード:  文字, セット, 照合, 順序, バイナリ, bin, utf, バイト, 比較, 変換