各「文字」列(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)を持つ場合、その内容は列の文字セットに従ってエンコードされていなければなりません。列の内容が異なる文字セットでエンコードされている場合、まず列を使用されているバイナリデータ型に変換し、次に必要な文字セットを持つ非バイナリ列に変換することができます。