GBK
TiDBはv5.4.0以降、GBK文字セットをサポートしています。このドキュメントでは、TiDBのGBK文字セットのサポートと互換性に関する情報を提供します。
TiDB v6.0.0以降、デフォルトで照合のための新しいフレームワーク有効になります。TiDB GBK文字セットのデフォルトの照合順序はgbk_chinese_ci
で、これはMySQLと一致しています。
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)
MySQLの互換性
このセクションでは、MySQL と TiDB 間の互換性に関する情報を提供します。
照合順序
MySQLにおけるGBK文字セットのデフォルトの照合順序はgbk_chinese_ci
です。TiDBにおけるGBK文字セットのデフォルトの照合順序は、TiDB設定項目new_collations_enabled_on_first_bootstrap
の値によって異なります。
- デフォルトでは、 TiDB 構成項目
new_collations_enabled_on_first_bootstrap
true
に設定されています。つまり、 照合のための新しいフレームワークが有効になっており、 GBK 文字セットのデフォルトの照合順序はgbk_chinese_ci
です。 - TiDB 構成項目
new_collations_enabled_on_first_bootstrap
false
に設定されている場合、 照合のための新しいフレームワーク無効になり、 GBK 文字セットのデフォルトの照合順序はgbk_bin
なります。
さらに、TiDB は GBK をutf8mb4
に変換してからバイナリ照合順序を使用するため、TiDB のgbk_bin
照合順序は MySQL のgbk_bin
照合順序と同じではありません。
不正な文字の互換性
システム変数
character_set_client
とcharacter_set_connection
同時にgbk
に設定されていない場合、TiDB は MySQL と同じ方法で不正な文字を処理します。character_set_client
とcharacter_set_connection
両方がgbk
に設定されている場合、TiDB は不正な文字を MySQL とは異なる方法で処理します。- MySQL は、読み取り操作と書き込み操作で不正な GBK 文字セットを異なる方法で処理します。
- TiDBは、読み取り操作と書き込み操作において、不正なGBK文字セットを同じ方法で処理します。SQL厳密モードでは、不正なGBK文字の読み取りまたは書き込み時にエラーが報告されます。非厳密モードでは、不正なGBK文字の読み取りまたは書き込み時に、TiDBは不正な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_TABLES もSTRICT_TRANS_TABLES も含まれていない場合 |
---|---|---|
MySQL | SELECT 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 |
TiDB | SELECT 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
テーブルのインポートをサポートしていません。TiCDCバージョン6.1.0より前のバージョンでは、
charset=GBK
テーブルのレプリケーションはサポートされていません。TiCDCのバージョン6.1.0より前のバージョンでは、TiDBクラスターへのcharset=GBK
テーブルのレプリケーションはサポートされていません。バックアップ&リストア(BR)バージョン5.4.0より前のバージョンでは、
charset=GBK
テーブルのリカバリはサポートされていません。また、 BRのバージョン5.4.0より前のバージョンでは、TiDBクラスターへのcharset=GBK
テーブルのリカバリはサポートされていません。