各「文字」列(つまり、CHAR、VARCHAR、TEXT タイプまたはその他の同義語タイプの列)には、列の文字セットと列の照合順序があります。
指定された列の文字セットと照合順序
CREATE TABLE および ALTER TABLE ステートメントには、列の文字セットと照合順序を指定するための構文があります。
CREATE TABLE table_name (
column_name {CHAR | VARCHAR | TEXT} (column_length)
[CHARACTER SET charset_name]
[COLLATE collation_name]
);
ALTER TABLE table_name MODIFY
col_name {CHAR | VARCHAR | TEXT} (column_length)
CHARACTER SET [=] charset_name
[COLLATE [=] collation_name]
例:
obclient> CREATE TABLE t (
col1 VARCHAR(5)
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci);
Query OK, 0 rows affected
obclient> ALTER TABLE t MODIFY
col1 VARCHAR(5)
CHARACTER SET gbk
COLLATE gbk_chinese_ci;
Query OK, 0 rows affected
列の文字セットと照合順序の選択
OceanBaseデータベースでは、列の文字セットと照合順序を次の方法で選択します。
CHARACTER SET charset_nameとCOLLATE collation_nameの両方が指定されている場合は、文字セットcharset_nameと照合順序collation_nameを使用します。CHARACTER SET charset_nameが指定されているがCOLLATEが指定されていない場合は、文字セットcharset_nameとそのデフォルトの照合順序を使用します。各文字セットのデフォルトの照合順序を確認するには、SHOW CHARACTER SETステートメントを使用してください。COLLATE collation_nameが指定されているがCHARACTER SETが指定されていない場合は、collation_nameに関連付けられた文字セットと指定された照合順序を使用します。CHARACTER SETとCOLLATEのどちらも指定されていない場合は、テーブルの文字セットと照合順序を使用します。
各列定義で列の文字セットと照合順序が指定されていない場合、テーブルの文字セットと照合順序が列定義のデフォルト値として使用されます。
さらに、OceanBaseデータベースのMySQLモードでは、列の COLLATE を設定した後に直接 ORDER BY すると、設定された照合順序で並べ替えることができます。また、ORDER BY の後に COLLATE を使用して、同一文字セットの異なる照合順序を設定することもできます。
obclient> CREATE TABLE t(a VARCHAR(10) COLLATE gb18030_2022_radical_ci);
Query OK, 0 rows affected
obclient> INSERT INTO t VALUES('a'),('A'),('b'),('B');
Query OK, 4 rows affected
Records: 4 Duplicates: 0 Warnings: 0
obclient> SELECT a FROM t ORDER BY a;
+------+
| a |
+------+
| a |
| A |
| b |
| B |
+------+
4 rows in set
obclient> SELECT a FROM t ORDER BY a COLLATE gb18030_2022_chinese_cs;
+------+
| a |
+------+
| A |
| B |
| a |
| b |
+------+
4 rows in set
列の文字セット変換条件
バイナリまたは非バイナリ文字列列を指定された文字セットに変換するには、ALTER TABLE を使用します。変換を正常に実行するには、次のいずれかの条件を満たす必要があります。
列がバイナリデータ型(
BINARY、VARBINARY、またはBLOB)を持つ場合、その列に含まれるすべての値は単一の文字セット(つまり、列を変換する文字セット)でエンコードされていなければなりません。バイナリ列を使用して複数の文字セットの情報を格納すると、OceanBaseデータベースはどの値がどの文字セットを使用しているかを判断できず、データを正しく変換できません。列が非バイナリデータ型(
CHAR、VARCHAR、またはTEXT)を持つ場合、その内容は列の文字セットに従ってエンコードされていなければなりません。列の内容が異なる文字セットでエンコードされている場合は、まず列を使用するバイナリデータ型に変換し、次に必要な文字セットを持つ非バイナリ列に変換することができます。