OceanBase 数据库的国际化支持特性目标是确保您可以部署能运行在任意国家的多语言程序。应用程序可以使用用户的母语和区域设置首选项呈现用户界面的内容,并处理数据。当前 OceanBase 数据库在展现界面时只支持英语。

在过去,ORACLE 数据库将全球化支持称为国家语言支持(National Language Support, NLS),NLS 实际是全球化支持的一个子集。OceanBase 数据库的 Oralce 模式兼容 ORACLE 数据库,继续沿用这个称呼。 NLS 是使用特定字符集选择国家语言和存储数据的能力,用一序列 NLS 参数实现。

关于语言支持

OceanBase 数据库存储数据时使用 UTF8MB4 字符集,可以存储绝大部分语言的字符。但是在本地消息、货币、时间日期等区域化展示方面,OceanBase 数据库当前版本只支持英语。客户端连接环境的 NLS_LANG 设置目前对 OceanBase 数据库连接没有影响。

关于地区支持

OceanBase 数据库当前版本对地区只支持美国英语地区,默认值为 AMERICA 。默认的本地时间格式、日期格式、数字和货币格式都取决于该地区的设置。

关于日期和时间格式

OceanBase 数据库当前版本对日期和时间格式只支持美国英语地区的日期和时间格式。默认的日期格式是:DD-MON-RR,默认的时间戳格式是:DD-MON-RR HH.MI.SSXFF AM 或 DD-MON-RR HH.MI.SSXFF AM TZR 。OceanBase 数据库支持通过更改会话参数或者实例参数调整日期和时间格式。

关于日历格式

OceanBase 数据库当前版本对日历格式只支持格列高利历(GREGORIAN ,又叫公历)。

关于数值和金额格式

不同的国家使用不同的数值和货币约定格式。OceanBase 数据库当前版本暂不支持货币格式设置,支持默认的数值分隔符是:., 。

关于字符串比较和排序

OceanBase 数据库当前版本只支持按 BINARY 比较和排序字符串,不支持修改。

关于长度语义

如果要以字节为单位计算字符串的长度,您需要知道在所使用的字符集中每个字符占多少个字节。

在单字节字符集中,字符串的字节数跟字符数是一致的;在多字节字符集中,一个字符会包含一到多个字节。特别是在变宽字符集中,很难根据字节长度计算字符数。以字节为单位计算列长称为字节语义,而以字符为单位计算列长称为字符语义

字符语义用于指定不同宽度的多字符串的存储需求。例如,在 Unicode 数据库(AL32UTF8)中,假设您必须有一个 VARCHAR2 列,它可以存储最多五个汉字和五个英文字符。使用字节语义,此列要求汉字 15 个字节(每个汉字字长 3 个字节),英文字符 5 个字节(每个英文字长 1 个字节),共 20 个字节。如果使用字符语义,该列需要 10 个字符。

OceanBase 数据库的 Oracle 模式默认使用字节语义。

关于 Unicode 和 SQL 国家字符数据类型

Unicode 是个编码系统,定义世界上大部分语言的字符。在 Unicode 中,每个字符都有一个唯一的编码,与平台、程序或语言无关。

在 OceanBase 数据库的 Oracle 模式中,有两种方式存储 Unicode 字符:

  • 可以创建租户时指定字符集为 UTF8,这样您可以在 SQL 的字符类型(CHAR , VARCHAR2 , CLOB 和 LONG)数据中存储 UTF-8 编码的字符。

  • 可以声明和使用 SQL 国家字符类型的列和变量。

SQL 国家字符类型包括 NCHAR,NVARCHAR2 和 NCLOB(OceanBase 数据库当前版本还不支持 NCLOB),它们也被称为 Unicode 数据类型,因为仅用于存储 Unicode 数据。

Unicode 数据使用的是国家字符集,在创建实例时指定。OceanBase 数据库支持两种国家字符集:UTF8 或 AL6UTF16(默认)。

当声明一个列或变量类型为 NCHAR 或 NVARCHAR2 , 指定的长度就是它可以存储的最大的字符个数,不是字节数。长度语义设置不影响国家字符。如下示例所示:

  1. obclient> create table t1(id number not null primary key, s1 varchar2(16), s2 nvarchar2(16));
  2. Query OK, 0 rows affected (0.05 sec)
  3. obclient> insert into t1 values(1,'中中中','中中中中中中');
  4. Query OK, 1 row affected (0.00 sec)
  5. obclient> commit;
  6. Query OK, 0 rows affected (0.00 sec)
  7. obclient> select id,s1,dump(s1,16) s1_d, s2,dump(s2,16) s2_d from t1\G
  8. *************************** 1. row ***************************
  9. ID: 1
  10. S1: 中中中
  11. S1_D: Typ=22 Len=6: d6,d0,d6,d0,d6,d0
  12. S2: 中中中中中中
  13. S2_D: Typ=43 Len=12: 4e,2d,4e,2d,4e,2d,4e,2d,4e,2d,4e,2d
  14. 1 row in set (0.00 sec)