如何为 Oracle 租户配置 GBK 字符集?

本文介绍如何为 Oracle 租户配置 GBK 字符集。

适用版本

OceanBase 数据库 V2.X 及后续版本。

创建 GBK 租户

通过在

CREATE TENANT

语句中增加

charset=gbk

,指定租户使用的字符集。创建租户的示例语句如下。

obclient> CREATE TENANT oracle replica_num = 1, resource_pool_list=(‘pool1’), charset=gbk SET ob_tcp_invited_nodes=’%’, ob_compatibility_mode=‘oracle’, parallel_max_servers=10, parallel_servers_target=10, ob_sql_work_area_percentage=20, secure_file_priv = “”;

连接创建的 Oracle 租户,验证

NLS_CHARACTERSET

变量的值是否为 GBK。

obclient> SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER=‘NLS_CHARACTERSET’; ±-----------------±---------±-------+ | PARAMETER | VALUE | CON_ID | ±-----------------±---------±-------+ | NLS_CHARACTERSET | ZHS16GBK | 0 | ±-----------------±---------±-------+

  • 注意

    CREATE TABLE

    语句中,

    charset

    不是变量,因此应放在

    SET

    子句前。

  • Oracle 租户中,字符集是租户级的概念,因此租户中所有用户表的 CHAR、VARCHAR2、CLOB 字段都是 GBK 字符集;但系统表中的 CHAR 与 VARCHAR2 字段仍会保留 UTF8 字符集。

  • Oracle 租户中,字符集不可修改,即不能通过

    ALETR

    语句修改租户、数据库、表与列的字符集。

————————下接评论区

配置链路字符集

链路字符集是客户端和服务器之间交互使用的字符集,租户字符集与链路字符集没有直接关系,GBK 租户既可以使用 GBK 字符集作为链路字符集,也可以使用 UTF8 作为链路字符集。

可以通过以下方式确定使用的字符集:

  • 客户端:客户端所在的环境是 GBK 环境还是 UTF8 环境。
  • JDBC:JDBC 程序的编码配置值是 GBK 还是 UTF8。


服务器端配置

对于 OceanBase 数据库 Oracle 租户,可以通过修改 

character_set_client
character_set_connection
 与 
character_set_results
 三个变量的值修改服务器端的链路字符集。

--永久性修改
obclient> SET GLOBAL character_set_client = gbk;
obclient> SET GLOBAL character_set_connection = gbk;
obclient> SET GLOBAL character_set_results = gbk;
--临时修改(仅对当前会话生效)
obclient> SET character_set_client = gbk;
obclient> SET character_set_connection = gbk;
obclient> SET character_set_results = gbk;

此外,如果仅需要临时修改服务器端的链路字符集,也可以通过 

SET NAMES
 语句进行修改。


obclient> SET NAMES gbk;

配置成功后,可以通过以下语句验证当前链路字符集的配置。

如果 

character_set_client
character_set_connection
 与 
character_set_results
 三个变量的值均为 
gbk
,表示链路 gbk 已经配置完毕。

obclient>show variables like '%character_set%';
+--------------------------+---------+
| VARIABLE_NAME            | VALUE   |
+--------------------------+---------+
| character_set_client     | gbk     |   -> 客户端字符集
| character_set_connection | gbk     |   -> 字符常量字符集(mysql模式)
| character_set_database   | gbk     |   -> 库字符集(mysql模式)
| character_set_filesystem | binary  |   -> 文件系统字符集(不使用)
| character_set_results    | gbk     |   -> 返回客户端(字符类型)结果的字符集
| character_set_server     | gbk     |   -> 租户字符集
| character_set_system     | utf8mb4 |   -> 系统字符集
+--------------------------+---------+


客户端配置

如果生产环境中的中文字符均为 GBK 编码,那么除了在服务器端配置 GBK 链路外,还需要修改客户端或驱动的链路字符集。

  • 使用 JDBC 连接数据库时,可以通过修改 URL 的参数设置,在 URL 中添加 
    characterEncoding=gbk
String url = "jdbc:oceanbase://xxx.xxx.xxx.xxx:xxxx?useSSL=false&useUnicode=true&characterEncoding=gbk&connectTimeout=30000&rewriteBatchedStatements=true";
  • 使用 OBClient 连接数据库时,需要按以下步骤配置。
  1. 修改环境变量。
export LANG=zh_CN.GBK
export LC_ALL=zh_CN.GBK
  1. 修改终端的编码配置。
  2. 本文以 ITEM2 终端为例。

  3. GBK 客户端链路