- TiDBについて
- クイックスタート
- デプロイ
- 移行する
- 管理
- アップグレード
- 規模
- バックアップと復元
- BRツールを使用する(推奨)
- タイムゾーンの構成
- 毎日のチェックリスト
- TiFlashを管理する
- TiUPを使用してTiDBを管理する
- オンラインでConfiguration / コンフィグレーションを変更する
- オンラインの安全でない回復
- 監視と警告
- トラブルシューティング
- 性能チューニング
- システムチューニング
- ソフトウェアのチューニング
- Configuration / コンフィグレーション
- コプロセッサーキャッシュ
- SQLチューニング
- チュートリアル
- TiDBツール
- 概要
- ユースケース
- ダウンロード
- TiUP
- ドキュメントマップ
- 概要
- 用語と概念
- TiUPコンポーネントを管理する
- FAQ
- トラブルシューティングガイド
- コマンドリファレンス
- 概要
- TiUPコマンド
- TiUPクラスターコマンド
- 概要
- tiup cluster audit
- tiup cluster check
- tiup cluster clean
- tiup cluster deploy
- tiup cluster destroy
- tiup cluster disable
- tiup cluster display
- tiup cluster edit-config
- tiup cluster enable
- tiup cluster help
- tiup cluster import
- tiup cluster list
- tiup cluster patch
- tiup cluster prune
- tiup cluster reload
- tiup cluster rename
- tiup cluster replay
- tiup cluster restart
- tiup cluster scale-in
- tiup cluster scale-out
- tiup cluster start
- tiup cluster stop
- tiup cluster template
- tiup cluster upgrade
- TiUPDMコマンド
- 概要
- tiup dm audit
- tiup dm deploy
- tiup dm destroy
- tiup dm disable
- tiup dm display
- tiup dm edit-config
- tiup dm enable
- tiup dm help
- tiup dm import
- tiup dm list
- tiup dm patch
- tiup dm prune
- tiup dm reload
- tiup dm replay
- tiup dm restart
- tiup dm scale-in
- tiup dm scale-out
- tiup dm start
- tiup dm stop
- tiup dm template
- tiup dm upgrade
- TiDBクラスタートポロジリファレンス
- DMクラスタートポロジリファレンス
- ミラーリファレンスガイド
- TiUPコンポーネント
- TiDB Operator
- バックアップと復元(BR)
- TiDB Binlog
- TiDB Lightning
- TiDBデータ移行
- TiDBデータ移行について
- DMの概要
- 基本的な機能
- 高度な機能
- シャーディングされたテーブルからのデータのマージと移行
- GH-ost/PT-oscを使用するMySQLデータベースからの移行
- SQL式を使用してDMLをフィルタリングする
- DMアーキテクチャ
- ベンチマーク
- クイックスタート
- データ移行シナリオ
- デプロイ
- 管理
- ツール
- クラスターのアップグレード
- データソースを作成する
- データソースの管理
- データ移行タスクの管理
- シャーディングDDLロックを手動で処理する
- 移行するMySQLインスタンスを切り替えます
- 移行するテーブルのスキーマを管理する
- アラートを処理する
- デイリーチェック
- トラブルシューティング
- 性能チューニング
- 参照
- セキュリティ
- モニタリング指標
- アラートルール
- エラーコード
- FAQ
- 用語集
- 例
- リリースノート
- TiCDC
- Dumpling
- sync-diff-inspector
- TiSpark
- 参照
- クラスターアーキテクチャ
- 主要な監視指標
- セキュリティ
- 権限
- SQL
- SQL言語の構造と構文
- SQLステートメント
ADD COLUMN
ADD INDEX
ADMIN
ADMIN CANCEL DDL
ADMIN CHECKSUM TABLE
ADMIN CHECK [TABLE|INDEX]
ADMIN SHOW DDL [JOBS|QUERIES]
ADMIN SHOW TELEMETRY
ALTER DATABASE
ALTER INDEX
ALTER INSTANCE
ALTER PLACEMENT POLICY
ALTER TABLE
ALTER USER
ANALYZE TABLE
BACKUP
BEGIN
CHANGE COLUMN
COMMIT
CHANGE DRAINER
CHANGE PUMP
CREATE [GLOBAL|SESSION] BINDING
CREATE DATABASE
CREATE INDEX
CREATE PLACEMENT POLICY
CREATE ROLE
CREATE SEQUENCE
CREATE TABLE LIKE
CREATE TABLE
CREATE USER
CREATE VIEW
DEALLOCATE
DELETE
DESC
DESCRIBE
DO
DROP [GLOBAL|SESSION] BINDING
DROP COLUMN
DROP DATABASE
DROP INDEX
DROP PLACEMENT POLICY
DROP ROLE
DROP SEQUENCE
DROP STATS
DROP TABLE
DROP USER
DROP VIEW
EXECUTE
EXPLAIN ANALYZE
EXPLAIN
FLASHBACK TABLE
FLUSH PRIVILEGES
FLUSH STATUS
FLUSH TABLES
GRANT <privileges>
GRANT <role>
INSERT
KILL [TIDB]
LOAD DATA
LOAD STATS
MODIFY COLUMN
PREPARE
RECOVER TABLE
RENAME INDEX
RENAME TABLE
REPLACE
RESTORE
REVOKE <privileges>
REVOKE <role>
ROLLBACK
SELECT
SET DEFAULT ROLE
SET [NAMES|CHARACTER SET]
SET PASSWORD
SET ROLE
SET TRANSACTION
SET [GLOBAL|SESSION] <variable>
SHOW ANALYZE STATUS
SHOW [BACKUPS|RESTORES]
SHOW [GLOBAL|SESSION] BINDINGS
SHOW BUILTINS
SHOW CHARACTER SET
SHOW COLLATION
SHOW [FULL] COLUMNS FROM
SHOW CONFIG
SHOW CREATE PLACEMENT POLICY
SHOW CREATE SEQUENCE
SHOW CREATE TABLE
SHOW CREATE USER
SHOW DATABASES
SHOW DRAINER STATUS
SHOW ENGINES
SHOW ERRORS
SHOW [FULL] FIELDS FROM
SHOW GRANTS
SHOW INDEX [FROM|IN]
SHOW INDEXES [FROM|IN]
SHOW KEYS [FROM|IN]
SHOW MASTER STATUS
SHOW PLACEMENT
SHOW PLACEMENT FOR
SHOW PLACEMENT LABELS
SHOW PLUGINS
SHOW PRIVILEGES
SHOW [FULL] PROCESSSLIST
SHOW PROFILES
SHOW PUMP STATUS
SHOW SCHEMAS
SHOW STATS_HEALTHY
SHOW STATS_HISTOGRAMS
SHOW STATS_META
SHOW STATUS
SHOW TABLE NEXT_ROW_ID
SHOW TABLE REGIONS
SHOW TABLE STATUS
SHOW [FULL] TABLES
SHOW [GLOBAL|SESSION] VARIABLES
SHOW WARNINGS
SHUTDOWN
SPLIT REGION
START TRANSACTION
TABLE
TRACE
TRUNCATE
UPDATE
USE
WITH
- データ型
- 関数と演算子
- クラスター化インデックス
- 制約
- 生成された列
- SQLモード
- テーブル属性
- トランザクション
- ガベージコレクション(GC)
- ビュー
- パーティショニング
- 一時テーブル
- 文字セットと照合
- SQLの配置ルール
- システムテーブル
mysql
- INFORMATION_SCHEMA
- 概要
ANALYZE_STATUS
CLIENT_ERRORS_SUMMARY_BY_HOST
CLIENT_ERRORS_SUMMARY_BY_USER
CLIENT_ERRORS_SUMMARY_GLOBAL
CHARACTER_SETS
CLUSTER_CONFIG
CLUSTER_HARDWARE
CLUSTER_INFO
CLUSTER_LOAD
CLUSTER_LOG
CLUSTER_SYSTEMINFO
COLLATIONS
COLLATION_CHARACTER_SET_APPLICABILITY
COLUMNS
DATA_LOCK_WAITS
DDL_JOBS
DEADLOCKS
ENGINES
INSPECTION_RESULT
INSPECTION_RULES
INSPECTION_SUMMARY
KEY_COLUMN_USAGE
METRICS_SUMMARY
METRICS_TABLES
PARTITIONS
PLACEMENT_RULES
PROCESSLIST
REFERENTIAL_CONSTRAINTS
SCHEMATA
SEQUENCES
SESSION_VARIABLES
SLOW_QUERY
STATISTICS
TABLES
TABLE_CONSTRAINTS
TABLE_STORAGE_STATS
TIDB_HOT_REGIONS
TIDB_HOT_REGIONS_HISTORY
TIDB_INDEXES
TIDB_SERVERS_INFO
TIDB_TRX
TIFLASH_REPLICA
TIKV_REGION_PEERS
TIKV_REGION_STATUS
TIKV_STORE_STATUS
USER_PRIVILEGES
VIEWS
METRICS_SCHEMA
- UI
- TiDBダッシュボード
- 概要
- 管理
- アクセス
- 概要ページ
- クラスター情報ページ
- Top SQL
- キービジュアライザーページ
- メトリクス関係グラフ
- SQLステートメント分析
- 遅いクエリページ
- クラスター診断
- 検索ログページ
- インスタンスプロファイリング
- セッションの管理とConfiguration / コンフィグレーション
- FAQ
- CLI
- コマンドラインフラグ
- Configuration / コンフィグレーションファイルのパラメーター
- システム変数
- ストレージエンジン
- テレメトリー
- エラーコード
- テーブルフィルター
- トポロジラベルによるレプリカのスケジュール
- よくある質問
- リリースノート
- すべてのリリース
- リリースタイムライン
- TiDBバージョニング
- v5.4
- v5.3
- v5.2
- v5.1
- v5.0
- v4.0
- v3.1
- v3.0
- v2.1
- v2.0
- v1.0
- 用語集
文字セットと照合
このドキュメントでは、TiDBでサポートされている文字セットと照合を紹介します。
コンセプト
文字セットは、記号とエンコーディングのセットです。 TiDBのデフォルトの文字セットはutf8mb4で、MySQL8.0以降のデフォルトと一致します。
照合順序は、文字セット内の文字を比較するための一連のルール、および文字の並べ替え順序です。たとえば、バイナリ照合順序では、 A
とa
は等しいと比較されません。
SET NAMES utf8mb4 COLLATE utf8mb4_bin;
SELECT 'A' = 'a';
SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
SELECT 'A' = 'a';
mysql> SELECT 'A' = 'a';
+-----------+
| 'A' = 'a' |
+-----------+
| 0 |
+-----------+
1 row in set (0.00 sec)
mysql> SET NAMES utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 0 rows affected (0.00 sec)
mysql> SELECT 'A' = 'a';
+-----------+
| 'A' = 'a' |
+-----------+
| 1 |
+-----------+
1 row in set (0.00 sec)
TiDBは、デフォルトでバイナリ照合順序を使用します。これは、デフォルトで大文字と小文字を区別しない照合順序を使用するMySQLとは異なります。
TiDBでサポートされている文字セットと照合
現在、TiDBは次の文字セットをサポートしています。
SHOW CHARACTER SET;
+---------+-------------------------------------+-------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+-------------------------------------+-------------------+--------+
| ascii | US ASCII | ascii_bin | 1 |
| binary | binary | binary | 1 |
| gbk | Chinese Internal Code Specification | gbk_bin | 2 |
| latin1 | Latin1 | latin1_bin | 1 |
| utf8 | UTF-8 Unicode | utf8_bin | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_bin | 4 |
+---------+-------------------------------------+-------------------+--------+
6 rows in set (0.00 sec)
TiDBは、次の照合をサポートしています。
mysql> show collation;
+-------------+---------+------+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------+---------+------+---------+----------+---------+
| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 |
| latin1_bin | latin1 | 47 | Yes | Yes | 1 |
| binary | binary | 63 | Yes | Yes | 1 |
| ascii_bin | ascii | 65 | Yes | Yes | 1 |
| utf8_bin | utf8 | 83 | Yes | Yes | 1 |
| gbk_bin | gbk | 87 | Yes | Yes | 1 |
+-------------+---------+------+---------+----------+---------+
6 rows in set (0.00 sec)
TiDBは、latin1をutf8のサブセットとして誤って扱います。これにより、latin1エンコーディングとutf8エンコーディングで異なる文字を格納するときに予期しない動作が発生する可能性があります。 utf8mb4文字セットに強くお勧めします。詳細については、 TiDB#18955を参照してください。
ノート:
TiDBのデフォルトの照合(接尾辞
_bin
のバイナリ照合)はMySQLのデフォルトの照合 (通常は接尾辞_general_ci
の一般的な照合)とは異なります。これにより、明示的な文字セットを指定しているが、選択される暗黙的なデフォルトの照合順序に依存している場合に、互換性のない動作が発生する可能性があります。
次のステートメントを使用して、文字セットに対応する照合( 照合のための新しいフレームワークの下)を表示できます。
SHOW COLLATION WHERE Charset = 'utf8mb4';
+--------------------+---------+------+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+--------------------+---------+------+---------+----------+---------+
| utf8mb4_bin | utf8mb4 | 46 | Yes | Yes | 1 |
| utf8mb4_general_ci | utf8mb4 | 45 | | Yes | 1 |
| utf8mb4_unicode_ci | utf8mb4 | 224 | | Yes | 1 |
+--------------------+---------+------+---------+----------+---------+
3 rows in set (0.00 sec)
GBK文字セットのTiDBサポートの詳細については、 GBKを参照してください。
utf8mb4
のutf8
とutf8mb4
MySQLでは、文字セットutf8
は最大3バイトに制限されています。これは、Basic Multilingual Plane(BMP)に文字を格納するには十分ですが、絵文字などの文字を格納するには十分ではありません。このため、代わりに文字セットutf8mb4
を使用することをお勧めします。
デフォルトでは、TiDBで作成されたデータをMySQLで安全に復元できるように、TiDBはutf8
に同じ3バイトの制限を提供します。これは、TiDB構成ファイルの値をcheck-mb4-value-in-utf8
からFALSE
に変更することで無効にできます。
以下は、4バイトの絵文字をテーブルに挿入するときのデフォルトの動作を示しています。 INSERT
ステートメントはutf8
文字セットでは失敗しますが、 utf8mb4
では成功します。
mysql> CREATE TABLE utf8_test (
-> c char(1) NOT NULL
-> ) CHARACTER SET utf8;
Query OK, 0 rows affected (0.09 sec)
mysql> CREATE TABLE utf8m4_test (
-> c char(1) NOT NULL
-> ) CHARACTER SET utf8mb4;
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT INTO utf8_test VALUES ('😉');
ERROR 1366 (HY000): incorrect utf8 value f09f9889(😉) for column c
mysql> INSERT INTO utf8m4_test VALUES ('😉');
Query OK, 1 row affected (0.02 sec)
mysql> SELECT char_length(c), length(c), c FROM utf8_test;
Empty set (0.01 sec)
mysql> SELECT char_length(c), length(c), c FROM utf8m4_test;
+----------------+-----------+------+
| char_length(c) | length(c) | c |
+----------------+-----------+------+
| 1 | 4 | 😉 |
+----------------+-----------+------+
1 row in set (0.00 sec)
異なるレイヤーでの文字セットと照合順序
文字セットと照合順序は、異なるレイヤーで設定できます。
データベースの文字セットと照合順序
各データベースには、文字セットと照合順序があります。次のステートメントを使用して、データベースの文字セットと照合順序を指定できます。
CREATE DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ALTER DATABASE db_name
[[DEFAULT] CHARACTER SET charset_name]
[[DEFAULT] COLLATE collation_name]
ここでは、 DATABASE
をSCHEMA
に置き換えることができます。
異なるデータベースは、異なる文字セットと照合を使用できます。 character_set_database
とcollation_database
を使用して、現在のデータベースの文字セットと照合順序を確認します。
CREATE SCHEMA test1 CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 0 rows affected (0.09 sec)
USE test1;
Database changed
SELECT @@character_set_database, @@collation_database;
+--------------------------|----------------------+
| @@character_set_database | @@collation_database |
+--------------------------|----------------------+
| utf8mb4 | utf8mb4_general_ci |
+--------------------------|----------------------+
1 row in set (0.00 sec)
CREATE SCHEMA test2 CHARACTER SET latin1 COLLATE latin1_bin;
Query OK, 0 rows affected (0.09 sec)
USE test2;
Database changed
SELECT @@character_set_database, @@collation_database;
+--------------------------|----------------------+
| @@character_set_database | @@collation_database |
+--------------------------|----------------------+
| latin1 | latin1_bin |
+--------------------------|----------------------+
1 row in set (0.00 sec)
INFORMATION_SCHEMA
の2つの値も確認できます。
SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAME
FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';
テーブルの文字セットと照合順序
次のステートメントを使用して、テーブルの文字セットと照合順序を指定できます。
CREATE TABLE tbl_name (column_list)
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]]
ALTER TABLE tbl_name
[[DEFAULT] CHARACTER SET charset_name]
[COLLATE collation_name]
例えば:
CREATE TABLE t1(a int) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Query OK, 0 rows affected (0.08 sec)
テーブルの文字セットと照合順序が指定されていない場合、データベースの文字セットと照合順序がデフォルト値として使用されます。
列の文字セットと照合順序
次のステートメントを使用して、列の文字セットと照合順序を指定できます。
col_name {CHAR | VARCHAR | TEXT} (col_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
col_name {ENUM | SET} (val_list)
[CHARACTER SET charset_name]
[COLLATE collation_name]
列の文字セットと照合順序が指定されていない場合は、テーブルの文字セットと照合順序がデフォルト値として使用されます。
文字列文字セットと照合順序
各文字列は、文字セットと照合順序に対応しています。文字列を使用する場合、次のオプションを使用できます。
[_charset_name]'string' [COLLATE collation_name]
例:
SELECT 'string';
SELECT _utf8mb4'string';
SELECT _utf8mb4'string' COLLATE utf8mb4_general_ci;
ルール:
- ルール1:
CHARACTER SET charset_name
とCOLLATE collation_name
を指定すると、charset_name
文字セットとcollation_name
照合順序が直接使用されます。 - ルール2:
CHARACTER SET charset_name
を指定し、COLLATE collation_name
を指定しない場合、charset_name
文字セットとデフォルトのcharset_name
の照合順序が使用されます。 - ルール3:
CHARACTER SET charset_name
もCOLLATE collation_name
も指定しない場合、システム変数character_set_connection
とcollation_connection
によって指定された文字セットと照合順序が使用されます。
クライアント接続の文字セットと照合順序
サーバーの文字セットと照合順序は、
character_set_server
とcollation_server
のシステム変数の値です。デフォルトデータベースの文字セットと照合順序は、
character_set_database
とcollation_database
のシステム変数の値です。
character_set_connection
とcollation_connection
を使用して、各接続の文字セットと照合順序を指定できます。 character_set_client
変数は、クライアントの文字セットを設定するためのものです。
結果を返す前に、 character_set_results
システム変数は、サーバーが結果のメタデータを含むクエリ結果をクライアントに返す文字セットを示します。
次のステートメントを使用して、クライアントに関連する文字セットと照合順序を設定できます。
SET NAMES 'charset_name' [COLLATE 'collation_name']
SET NAMES
は、クライアントがSQLステートメントをサーバーに送信するために使用する文字セットを示します。SET NAMES utf8mb4
は、クライアントからのすべての要求がutf8mb4を使用し、サーバーからの結果も使用することを示します。SET NAMES 'charset_name'
ステートメントは、次のステートメントの組み合わせと同等です。SET character_set_client = charset_name; SET character_set_results = charset_name; SET character_set_connection = charset_name;
COLLATE
はオプションです。存在しない場合は、デフォルトのcharset_name
の照合順序を使用してcollation_connection
を設定します。SET CHARACTER SET 'charset_name'
SET NAMES
と同様に、SET NAMES 'charset_name'
ステートメントは次のステートメントの組み合わせと同等です。SET character_set_client = charset_name; SET character_set_results = charset_name; SET charset_connection = @@charset_database; SET collation_connection = @@collation_database;
文字セットと照合の選択の優先順位
文字列>列>テーブル>データベース>サーバー
文字セットと照合順序の選択に関する一般的な規則
- ルール1:
CHARACTER SET charset_name
とCOLLATE collation_name
を指定すると、charset_name
文字セットとcollation_name
照合順序が直接使用されます。 - ルール2:
CHARACTER SET charset_name
を指定し、COLLATE collation_name
を指定しない場合、charset_name
文字セットとデフォルトのcharset_name
の照合順序が使用されます。 - ルール3:
CHARACTER SET charset_name
もCOLLATE collation_name
も指定しない場合、より高い最適化レベルの文字セットと照合順序が使用されます。
文字の妥当性チェック
指定された文字セットがutf8
またはutf8mb4
の場合、TiDBは有効なutf8
文字のみをサポートします。無効な文字の場合、TiDBはincorrect utf8 value
エラーを報告します。このTiDBの文字の有効性チェックは、MySQL 8.0と互換性がありますが、MySQL5.7以前のバージョンとは互換性がありません。
このエラー報告を無効にするには、 set @@tidb_skip_utf8_check=1;
を使用して文字チェックをスキップします。
照合サポートフレームワーク
照合順序の構文サポートとセマンティックサポートは、 new_collations_enabled_on_first_bootstrap
の構成項目の影響を受けます。構文サポートとセマンティックサポートは異なります。前者は、TiDBが照合を解析および設定できることを示しています。後者は、文字列を比較するときにTiDBが照合を正しく使用できることを示しています。
v4.0より前では、TiDBは照合のための古いフレームワークのみを提供します。このフレームワークでは、TiDBはほとんどのMySQL照合を構文解析的にサポートしますが、意味的にはすべての照合をバイナリ照合として受け取ります。
v4.0以降、TiDBは照合のための新しいフレームワークをサポートします。このフレームワークでは、TiDBはさまざまな照合を意味的に解析し、文字列を比較するときに照合を厳密に追跡します。
照合のための古いフレームワーク
v4.0より前では、TiDBでほとんどのMySQL照合を指定でき、これらの照合はデフォルトの照合に従って処理されます。つまり、バイト順序によって文字の順序が決まります。 MySQLとは異なり、TiDBは、文字を比較する前に、照合順序のPADDING
属性に従って文字の末尾のスペースを削除します。これにより、次の動作の違いが発生します。
CREATE TABLE t(a varchar(20) charset utf8mb4 collate utf8mb4_general_ci PRIMARY KEY);
Query OK, 0 rows affected
INSERT INTO t VALUES ('A');
Query OK, 1 row affected
INSERT INTO t VALUES ('a');
Query OK, 1 row affected # In TiDB, it is successfully executed. In MySQL, because utf8mb4_general_ci is case-insensitive, the `Duplicate entry 'a'` error is reported.
INSERT INTO t1 VALUES ('a ');
Query OK, 1 row affected # In TiDB, it is successfully executed. In MySQL, because comparison is performed after the spaces are filled in, the `Duplicate entry 'a '` error is returned.
照合のための新しいフレームワーク
TiDB 4.0では、照合のための完全なフレームワークが導入されています。この新しいフレームワークは、セマンティック解析の照合をサポートし、クラスタが最初に初期化されるときに新しいフレームワークを有効にするかどうかを決定するnew_collations_enabled_on_first_bootstrap
の構成項目を導入します。構成項目を有効にした後でクラスタを初期化すると、 mysql
のnew_collation_enabled
変数を使用して新しい照合順序が有効になっているかどうかを確認できます。 tidb
テーブル:
SELECT VARIABLE_VALUE FROM mysql.tidb WHERE VARIABLE_NAME='new_collation_enabled';
+----------------+
| VARIABLE_VALUE |
+----------------+
| True |
+----------------+
1 row in set (0.00 sec)
新しいフレームワークでは、 utf8mb4_general_ci
はMySQLと互換性のあるutf8_general_ci
、およびutf8mb4_unicode_ci
のgbk_bin
をgbk_chinese_ci
しutf8_unicode_ci
。
utf8_general_ci
、およびutf8mb4_general_ci
のutf8mb4_unicode_ci
gbk_chinese_ci
が使用されている場合、文字列の比較では大文字と小文字が区別されず、アクセントも区別されutf8_unicode_ci
ん。同時に、TiDBは照合のPADDING
の動作も修正します。
CREATE TABLE t(a varchar(20) charset utf8mb4 collate utf8mb4_general_ci PRIMARY KEY);
Query OK, 0 rows affected (0.00 sec)
INSERT INTO t VALUES ('A');
Query OK, 1 row affected (0.00 sec)
INSERT INTO t VALUES ('a');
ERROR 1062 (23000): Duplicate entry 'a' for key 'PRIMARY' # TiDB is compatible with the case-insensitive collation of MySQL.
INSERT INTO t VALUES ('a ');
ERROR 1062 (23000): Duplicate entry 'a ' for key 'PRIMARY' # TiDB modifies the `PADDING` behavior to be compatible with MySQL.
ノート:
TiDBでのパディングの実装は、MySQLでの実装とは異なります。 MySQLでは、パディングはスペースを埋めることによって実装されます。 TiDBでは、パディングは最後のスペースを切り取って実装されます。 2つのアプローチは、ほとんどの場合同じです。唯一の例外は、文字列の末尾にスペース(0x20)未満の文字が含まれている場合です。たとえば、TiDBでの
'a' < 'a\t'
の結果は1
ですが、MySQLでは'a' < 'a\t'
は'a ' < 'a\t'
に相当し、結果は0
です。
式の照合の強制力の値
式に異なる照合の複数の句が含まれる場合は、計算で使用される照合順序を推測する必要があります。ルールは次のとおりです。
- 明示的な
COLLATE
節の強制力の値は0
です。 - 2つの文字列の照合に互換性がない場合、照合が異なる2つの文字列の連結の強制力の値は
1
です。 - 列
CAST()
、またはCONVERT()
の照合順序には、BINARY()
の強制力値があり2
。 - システム定数(
USER ()
またはVERSION ()
によって返される文字列)の強制力の値は3
です。 - 定数の強制力の値は
4
です。 - 数値または中間変数の強制力の値は
5
です。 NULL
またはNULL
から派生した式の強制力の値は、6
です。
照合を推測する場合、TiDBは、より低い強制力の値を持つ式の照合順序を使用することを好みます。 2つの句の強制力の値が同じである場合、照合順序は次の優先順位に従って決定されます。
バイナリ>utf8mb4_bin>(utf8mb4_general_ci = utf8mb4_unicode_ci)> utf8_bin>(utf8_general_ci = utf8_unicode_ci)> latin1_bin> ascii_bin
TiDBは照合順序を推測できず、次の状況でエラーを報告します。
- 2つの句の照合が異なり、両方の句の強制力の値が
0
である場合。 - 2つの句の照合に互換性がなく、返される式のタイプが
String
の場合。
COLLATE
句
TiDBは、式の照合順序を指定するためのCOLLATE
句の使用をサポートしています。この式の強制力の値は0
であり、これが最も優先度が高くなります。次の例を参照してください。
SELECT 'a' = _utf8mb4 'A' collate utf8mb4_general_ci;
+-----------------------------------------------+
| 'a' = _utf8mb4 'A' collate utf8mb4_general_ci |
+-----------------------------------------------+
| 1 |
+-----------------------------------------------+
1 row in set (0.00 sec)
詳細については、 接続文字セットと照合を参照してください。