重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

GBK

v5.4.0以降、TiDBはGBK文字セットをサポートします。このドキュメントは、GBK文字セットのTiDBサポートと互換性情報を提供します。

SHOW CHARACTER SET WHERE CHARSET = 'gbk';
+---------+-------------------------------------+-------------------+--------+
| Charset | Description                         | Default collation | Maxlen |
+---------+-------------------------------------+-------------------+--------+
| gbk     | Chinese Internal Code Specification | gbk_bin           |      2 |
+---------+-------------------------------------+-------------------+--------+
1 row in set (0.00 sec)

SHOW COLLATION WHERE CHARSET = 'gbk';
+----------------+---------+------+---------+----------+---------+
| Collation      | Charset | Id   | Default | Compiled | Sortlen |
+----------------+---------+------+---------+----------+---------+
| gbk_bin        | gbk     |   87 |         | Yes      |       1 |
+----------------+---------+------+---------+----------+---------+
1 rows in set (0.00 sec)

MySQLの互換性

このセクションでは、MySQLとTiDB間の互換性情報を提供します。

照合

MySQLのGBK文字セットのデフォルトの照合順序はgbk_chinese_ciです。 MySQLとは異なり、TiDBのGBK文字セットのデフォルトの照合順序はgbk_binです。さらに、TiDBはGBKをUTF8MB4に変換してから、バイナリ照合順序を使用するため、TiDBのgbk_bin照合順序はMySQLのgbk_bin照合順序と同じではありません。

TiDBをMySQLGBK文字セットの照合と互換性を持たせるには、最初にTiDBクラスタを初期化するときに、TiDBオプションnew_collations_enabled_on_first_bootstrapからtrueを設定して照合のための新しいフレームワークを有効にする必要があります。

TiDBをMySQLGBK文字セットの照合と互換性を持たせるために、TiDBクラスタを最初に初期化するときに、 TiDB Cloudはデフォルトで照合のための新しいフレームワークを有効にします。

照合の新しいフレームワークを有効にした後、GBK文字セットに対応する照合を確認すると、TiDBGBKのデフォルトの照合順序がgbk_chinese_ciに変更されていることがわかります。

SHOW CHARACTER SET WHERE CHARSET = 'gbk';
+---------+-------------------------------------+-------------------+--------+
| Charset | Description                         | Default collation | Maxlen |
+---------+-------------------------------------+-------------------+--------+
| gbk     | Chinese Internal Code Specification | gbk_chinese_ci    |      2 |
+---------+-------------------------------------+-------------------+--------+
1 row in set (0.00 sec)

SHOW COLLATION WHERE CHARSET = 'gbk';
+----------------+---------+------+---------+----------+---------+
| Collation      | Charset | Id   | Default | Compiled | Sortlen |
+----------------+---------+------+---------+----------+---------+
| gbk_bin        | gbk     |   87 |         | Yes      |       1 |
| gbk_chinese_ci | gbk     |   28 | Yes     | Yes      |       1 |
+----------------+---------+------+---------+----------+---------+
2 rows in set (0.00 sec)

不正な文字の互換性

  • システム変数character_set_clientcharacter_set_connectionが同時にgbkに設定されていない場合、TiDBはMySQLと同じ方法で不正な文字を処理します。

  • character_set_clientcharacter_set_connectionの両方がgbkに設定されている場合、TiDBはMySQLとは異なる方法で不正な文字を処理します。

    • MySQLは、読み取り操作と書き込み操作で不正なGBK文字セットを異なる方法で処理します。
    • TiDBは、読み取りおよび書き込み操作で不正なGBK文字セットを同じ方法で処理します。 SQL strictモードでは、TiDBは、不正なGBK文字の読み取りまたは書き込み時にエラーを報告します。非厳密モードでは、TiDBは、不正なGBK文字の読み取りまたは書き込み時に、不正なGBK文字を?に置き換えます。

たとえば、 SET NAMES gbkの後に、MySQLとTiDBでそれぞれCREATE TABLE gbk_table(a VARCHAR(32) CHARACTER SET gbk)ステートメントを使用してテーブルを作成し、次のテーブルのSQLステートメントを実行すると、詳細な違いを確認できます。

データベース構成されたSQLモードにSTRICT_ALL_TABLESまたはSTRICT_TRANS_TABLESが含まれている場合構成されたSQLモードにSTRICT_ALL_TABLESSTRICT_TRANS_TABLESも含まれていない場合
MySQLSELECT HEX('一a');
e4b88061

INSERT INTO gbk_table values('一a');
Incorrect Error
SELECT HEX('一a');
e4b88061

INSERT INTO gbk_table VALUES('一a');
SELECT HEX(a) FROM gbk_table;
e4b8
TiDBSELECT HEX('一a');
Incorrect Error

INSERT INTO gbk_table VALUES('一a');
Incorrect Error
SELECT HEX('一a');
e4b83f

INSERT INTO gbk_table VALUES('一a');
SELECT HEX(a) FROM gbk_table;
e4b83f

上記の表では、 utf8mb4バイトセットのSELECT HEX('a');の結果はe4b88061です。

その他のMySQL互換性

  • 現在、TiDBは、 ALTER TABLEステートメントを使用して他の文字セットタイプをgbkに変換したり、 gbkから他の文字セットタイプに変換したりすることをサポートしていません。
  • TiDBは_gbkの使用をサポートしていません。例えば:

    CREATE TABLE t(a CHAR(10) CHARSET BINARY);
    Query OK, 0 rows affected (0.00 sec)
    INSERT INTO t VALUES (_gbk'啊');
    ERROR 1115 (42000): Unsupported character introducer: 'gbk'
    
  • 現在、 ENUMおよびSETタイプのバイナリ文字の場合、TiDBはそれらをutf8mb4文字セットとして扱います。

コンポーネントの互換性

  • 現在、TiFlashはGBK文字セットをサポートしていません。

  • TiDBデータ移行(DM)は、v5.4.0より前のTiDBクラスターへのcharset=GBKのテーブルの移行をサポートしていません。

  • TiDB Lightningは、v5.4.0より前のTiDBクラスターへのcharset=GBKのテーブルのインポートをサポートしていません。

  • v6.1.0より前のバージョンのTiCDCは、 charset=GBKのテーブルの複製をサポートしていません。 TiCDCのどのバージョンも、v6.1.0より前のTiDBクラスターへのcharset=GBKのテーブルの複製をサポートしていません。

  • v5.4.0より前のバージョンのバックアップと復元(BR)は、 charset=GBKのテーブルのリカバリをサポートしていません。 v5.4.0より前のバージョンのBRは、 charset=GBKのテーブルをTiDBクラスターにリカバリーすることをサポートしていません。