首批通过分布式安全可靠测评,为关键业务系统打造
Oracle 租户 GBK 字符集生僻字显示乱码
更新时间:2026-05-18 09:11
问题现象
OceanBase 数据库 Oracle 租户,租户字符集是 GBK,插入生僻字显示乱码。
测试示例如下。
创建表。
obclient > create table t1 (id number,name varchar2(10),client_charset varchar2(10) ,terminal_charset varchar2(10));终端 UTF8 插入数据。
obclient > set names utf8mb4;obclient > insert into t1 values(1,'匼','utf8mb4' ,'utf8') ;obclient > set names gbk;obclient > insert into t1 values(2,'匼','gbk' ,'utf8') ;终端 GBK 插入数据。
obclient > set names utf8mb4;obclient > insert into t1 values(3,'匼','utf8mb4' ,'gbk') ;obclient > set names gbk;obclient > insert into t1 values(4,'匼','gbk' ,'gbk') ;查询验证。
终端 GBK 客户端 UTF8 查询。
obclient > set names utf8mb4;obclient > select id,name,client_charset,terminal_charset,dump(name,16) from t1;+------+------+----------------+------------------+------------------------+ | ID | NAME | CLIENT_CHARSET | TERMINAL_CHARSET | DUMP(NAME,16) | +------+------+----------------+------------------+------------------------+ | 1 | 鍖 | utf8mb4 | utf8 | Typ=22 Len=2: 85,5c | | 2 | 閸 | gbk | utf8 | Typ=22 Len=3: e5,8c,bc | | 3 | ?\ | utf8mb4 | gbk | Typ=22 Len=2: 3f,5c | | 4 | 鍖 | gbk | gbk | Typ=22 Len=2: 85,5c | +------+------+----------------+------------------+------------------------+ 4 rows in set (0.005 sec)终端 GBK,客户端 GBK 查询。
obclient > set names gbk;obclient > select id,name,client_charset,terminal_charset,dump(name,16) from t1;+------+------+----------------+------------------+------------------------+ | ID | NAME | CLIENT_CHARSET | TERMINAL_CHARSET | DUMP(NAME,16) | +------+------+----------------+------------------+------------------------+ | 1 | 匼 | utf8mb4 | utf8 | Typ=22 Len=2: 85,5c | | 2 | 鍖 | gbk | utf8 | Typ=22 Len=3: e5,8c,bc | | 3 | ?\ | utf8mb4 | gbk | Typ=22 Len=2: 3f,5c | | 4 | 匼 | gbk | gbk | Typ=22 Len=2: 85,5c | +------+------+----------------+------------------+------------------------+ 4 rows in set (0.002 sec)终端 UTF8 客户端 UTF8 查询。
obclient > set names utf8mb4;obclient > set names utf8mb4; Query OK, 0 rows affected (0.002 sec)obclient > select id,name,client_charset,terminal_charset,dump(name,16) from t1;+------+------+----------------+------------------+------------------------+ | ID | NAME | CLIENT_CHARSET | TERMINAL_CHARSET | DUMP(NAME,16) | +------+------+----------------+------------------+------------------------+ | 1 | 匼 | utf8mb4 | utf8 | Typ=22 Len=2: 85,5c | | 2 | 鍖 | gbk | utf8 | Typ=22 Len=3: e5,8c,bc | | 3 | ?\ | utf8mb4 | gbk | Typ=22 Len=2: 3f,5c | | 4 | 匼 | gbk | gbk | Typ=22 Len=2: 85,5c | +------+------+----------------+------------------+------------------------+ 4 rows in set (0.007 sec)终端 UTF8 客户端 GBK 查询。
obclient > set names gbk; Query OK, 0 rows affected (0.002 sec)obclient > select id,name,client_charset,terminal_charset,dump(name,16) from t1;+------+------+----------------+------------------+------------------------+ | ID | NAME | CLIENT_CHARSET | TERMINAL_CHARSET | DUMP(NAME,16) | +------+------+----------------+------------------+------------------------+ | 1 | | utf8mb4 | utf8 | Typ=22 Len=2: 85,5c | | 2 | 匼 | gbk | utf8 | Typ=22 Len=3: e5,8c,bc | | 3 | ?\ | utf8mb4 | gbk | Typ=22 Len=2: 3f,5c | | 4 | | gbk | gbk | Typ=22 Len=2: 85,5c | +------+------+----------------+------------------+------------------------+ 4 rows in set (0.002 sec)
说明
- 当客户端类型和终端字符集类型一致时,插入到数据库的 16 进制 是符合数据库编码的 “匼”字 的 GBK 编码为:855C。
- 当客户端和终端字符集类型一致时,可以正常显示字符。
- 当客户端类型和和数据库字符集类型一致时(同为 GBK),插入的值是终端类型的编码:TERMINAL_CHARSET = GBK 插入 “匼”的 GBK 编码;TERMINAL_CHARSET = UTF8 插入 “匼”的 UTF8 编码。
适用版本
OceanBase V2.x、V3.x 版本。
问题原因
终端、客户端和数据库 server 字符集不一致。
解决方法
终端设置 GBK 字符集显示,客户端先设置 set names gbk,使 client、connection、server 的字符集一致,解决乱码问题。