首批通过分布式安全可靠测评,为关键业务系统打造
字符集和字符序
更新时间:2026-06-08 13:13:08
OceanBase 数据库 Oracle 模式下目前支持如下字符集:
binary
utf8mb4
说明
为支持无缝迁移,OceanBase 数据库在语法上将
UTF8视为UTF8MB4的同义词。gbk
utf16
gb18030
latin1
gb2312
gb18030_2022
ascii
tis620
eucjpms
utf16le
hkscs
hkscs31
dec8
macroman
说明
对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持字符集:gb2312、eucjpms 和 macroman。
功能适用性
OceanBase Connector/J 暂不支持 utf8mb4_unicode_ci 和 utf16_unicode_ci。
OceanBase 数据库 Oracle 模式下目前支持的字符序如下表所示。
| 字符序 | 所属字符集 | 说明 |
|---|---|---|
| utf8mb4_general_ci | utf8mb4 | 使用通用排序规则。 |
| utf8mb4_bin | utf8mb4 | 使用二进制排序规则。 |
| utf8mb4_unicode_ci | utf8mb4 | 使用基于 Unicode Collation Algorithm (UCA) 的排序规则。 |
| binary | binary | 使用二进制排序规则。 |
| gbk_chinese_ci | gbk | 使用中文语言排序规则。 |
| gbk_bin | gbk | 使用二进制排序规则。 |
| utf16_general_ci | utf16 | 使用通用排序规则。 |
| utf16_bin | utf16 | 使用二进制排序规则。 |
| utf16_unicode_ci | utf16 | 使用基于 Unicode Collation Algorithm (UCA) 的排序规则。 |
| gb18030_chinese_ci | gb18030 | 使用中文语言排序规则。 |
| gb18030_bin | gb18030 | 使用二进制排序规则。 |
| latin1_swedish_ci | latin1 | 使用瑞典语/芬兰语排序规则。 |
| latin1_german1_ci | latin1 | 用于德国(German)语言环境下的 latin1 字符集的排序规则。 |
| latin1_danish_ci | latin1 | 用于丹麦(Danish)语言环境下的 latin1 字符集的排序规则。 |
| latin1_german2_ci | latin1 | 用于德语环境,适用于需要按照字典顺序进行字符比较的应用场景。 |
| latin1_general_ci | latin1 | 用于需要不区分大小写且支持重音符号的场景,如某些欧洲语言的数据库设计。 |
| latin1_general_cs | latin1 | 用于区分大小写的通用排序规则,支持多种语言(如西欧语言)。 |
| latin1_spanish_ci | latin1 | 用于西班牙(Spanish)语言环境的排序规则。 |
| latin1_bin | latin1 | latin1 使用二进制排序规则。 |
| gb18030_2022_bin | gb18030_2022 | 使用二进制排序规则。Oracle 模式下该字符集的默认字符序。 |
| gb18030_2022_chinese_ci | gb18030_2022 | 使用拼音排序规则。不区分大小写。 |
| gb18030_2022_chinese_cs | gb18030_2022 | 使用拼音排序规则。区分大小写。 |
| gb18030_2022_radical_ci | gb18030_2022 | 使用部首笔画排序规则。不区分大小写。 |
| gb18030_2022_radical_cs | gb18030_2022 | 使用部首笔画排序规则。区分大小写。 |
| gb18030_2022_stroke_ci | gb18030_2022 | 使用笔画排序规则。不区分大小写。 |
| gb18030_2022_stroke_cs | gb18030_2022 | 使用笔画排序规则。区分大小写。 |
| ascii_bin | ascii | 校对规则是基于二进制位比较的。它将字符作为二进制数据进行比较和排序。 |
| ascii_general_ci | ascii | 校对规则是基于字母的不区分大小写的排序规则。它忽略了字符的大小写差异,将大写字母和小写字母视为相同的字符。 |
| tis620_bin | tis620 | 使用二进制排序规则。 |
| tis620_thai_ci | tis620 | 使用泰语排序规则,不区分大小写。 |
| gb2312_chinese_ci | gb2312 | 使用 GB2312 字符集,按照中文排序规则进行不区分大小写的排序。
说明对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持该字符序。 |
| gb2312_bin | gb2312 | 使用 GB2312 字符集,按照二进制顺序进行区分大小写的排序。
说明对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持该字符序。 |
| eucjpms_japanese_ci | eucjpms | 使用 EUCJPMS 字符集,按照日语排序规则进行不区分大小写的排序。
说明对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持该字符序。 |
| eucjpms_bin | eucjpms | 使用 EUCJPMS 字符集,按照二进制顺序进行区分大小写的排序。
说明对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持该字符序。 |
| macroman_general_ci | macroman | 使用 MacRoman 字符集,按照通用排序规则进行不区分大小写的排序。
说明对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持该字符序。 |
| macroman_bin | macroman | 使用 MacRoman 字符集,按照二进制顺序进行区分大小写的排序。
说明对于 OceanBase 数据库 V4.3.5 版本,从 V4.3.5 BP1 版本开始支持该字符序。 |
OceanBase 数据库 Oracle 模式下,通过系统视图 NLS_DATABASE_PARAMETERS 可以查看 nls_sort 变量所对应的系统排序规则,nls_nchar_characterset 变量对应数据库默认字符集(用于 NCHAR、NVARCHAR2、NCLOB 等数据类型),nls_characterset 对应数据库中 CHAR、VARCHAR2、CLOB 等数据类型的默认字符集。
obclient> SELECT * FROM NLS_DATABASE_PARAMETERS;
+-------------------------+------------------------------+
| PARAMETER | VALUE |
+-------------------------+------------------------------+
| NLS_DATE_FORMAT | DD-MON-RR |
| NLS_TIMESTAMP_FORMAT | DD-MON-RR HH.MI.SSXFF AM |
| NLS_TIMESTAMP_TZ_FORMAT | DD-MON-RR HH.MI.SSXFF AM TZR |
| NLS_TERRITORY | AMERICA |
| NLS_SORT | BINARY |
| NLS_COMP | BINARY |
| NLS_CHARACTERSET | AL32UTF8 |
| NLS_NCHAR_CHARACTERSET | AL16UTF16 |
| NLS_DATE_LANGUAGE | AMERICAN |
| NLS_LENGTH_SEMANTICS | BYTE |
| NLS_NCHAR_CONV_EXCP | FALSE |
| NLS_CALENDAR | GREGORIAN |
| NLS_NUMERIC_CHARACTERS | ., |
| NLS_CURRENCY | $ |
| NLS_ISO_CURRENCY | AMERICA |
| NLS_DUAL_CURRENCY | $ |
+-------------------------+------------------------------+
16 rows in set
OceanBase 数据库支持指定非默认字符集与服务器通信。例如,要使用 gbk 字符集,在连接到服务器后执行以下语句:
obclient> SET NAMES gbk;
Query OK, 0 rows affected
OceanBase 数据库 Oracle 模式下字符集的默认排序方式为 bin,但可以通过 NLSSORT() 函数指定其他的排序方式。
obclient> CREATE TABLE t(a VARCHAR(10));
Query OK, 0 rows affected
obclient> INSERT INTO t VALUES ('a'),('A'),('b'),('B'),('闖'),('闯'),('门'),('醜'),('锌'),('陆'),('ζ');
Query OK, 11 rows affected
Records: 11 Duplicates: 0 Warnings: 0
obclient> SELECT a,NLSSORT(a, 'NLS_SORT=SCHINESE_PINYIN2_M' ) FROM t ORDER BY NLSSORT(a, 'NLS_SORT=SCHINESE_PINYIN2_M' );
+------+------------------------------------------+
| A | NLSSORT(A,'NLS_SORT=SCHINESE_PINYIN2_M') |
+------+------------------------------------------+
| A | 41 |
| B | 42 |
| a | 61 |
| b | 62 |
| ζ | A6C6 |
| 醜 | FFA01016 |
| 闯 | FFA01156 |
| 闖 | FFA0115E |
| 陆 | FFA04E35 |
| 门 | FFA052DB |
| 锌 | FFA08A0F |
+------+------------------------------------------+
11 rows in set
gb18030 与 gb18030_2022 间的转换
OceanBase 数据库当前版本不支持 gb18030 与 gb18030_2022 的隐式转换,但用户可以通过 CONVERT 将一个 gb18030 的字符串的字符集显式转换为 gb18030_2022。该转换没有经过 Unicode,采取了保留编码的方法。如下示例所示。
obclient> CREATE TABLE t1 (c1 VARCHAR(10));
Query OK, 0 rows affected
obclient> INSERT INTO t1 VALUES ('字');
Query OK, 1 row affected
obclient> SELECT RAWTOHEX(c1), RAWTOHEX(CONVERT(c1, 'ZHS32GB18030_2022')) FROM t1;
+--------------+-------------------------------------------+
| RAWTOHEX(C1) | RAWTOHEX(CONVERT(C1,'ZHS32GB18030_2022')) |
+--------------+-------------------------------------------+
| D7D6 | D7D6 |
+--------------+-------------------------------------------+
1 row in set
由于 OceanBase 数据库 Oracle 模式下的字符集是租户级别的,在使用 gb18030_2022 字符集的租户中,所有用户表的 CHAR、VARCHAR2、CLOB 字段都是 gb18030_2022 字符集,并且都按照二进制排序(gb18030_2022_bin)。在 Oracle 模式下,字符串常量在解析时即被转换为租户字符集,以统一 SQL 的字符集。
/* gb18030_2022 租户下,列 c 的字符集为 gb18030_2022,字符序为 gb18030_2022_bin */
obclient> CREATE TABLE t1(c VARCHAR(100));
Query OK, 0 rows affected
obclient> INSERT INTO t1 values('字');
Query OK, 1 row affected
/* 设置客户端字符集为 gb18030 */
obclient> SET NAMES gb18030;
Query OK, 0 rows affected
/* SQL 在解析时将字符串 '字' 转换为 gb18030_2022,SQL 正常执行不报错 */
obclient > SELECT * FROM t1 WHERE c = '字';
+------+
| C |
+------+
| 字 |
+------+
1 row in set