租户在使用PanWeiDB时经常询问如下字符集相关的问题:
- 一个UTF8字符集的数据库,中英文各占用多少字节长度?
- 如果使用GB18030字符集,中英文又各占用多少字节长度?
- 磐维数据库支持哪些字符集呢?
本文将通过实验来理解字符集相关的几个问题以及一个与字符集相关的客户端调优案例
字符集的初始化及设置
磐维数据库在安装部署时通过如下参数对字符集进行了初始化设置:
om安装方式
$ gs_install -X /database/panweidb/soft/xxx.xml \
--gsinit-parameter="--encoding=UTF8" \
--gsinit-parameter="--lc-collate=C" \
--gsinit-parameter="--lc-ctype=C" \
...
...
ptk安装方式
ptk方式安装,在config.yaml进行如下设置
gs_initdb_opts:
- "--encoding=UTF8"
- "--lc-collate=C"
- "--lc-ctype=C"
...
...
初始化设置字符集时需要搭配LOCALE一起设置,LOCALE是一组规则,包括:排序方式LC_COLLATE,字符分类LC_CTYPE,消息语言LC_MESSAGES,货币格式LC_MONETARY,数字格式LC_NUMERIC,日期时间格式LC_TIME。
通常LOCALE默认使用C的本地化规则,上面的两个设置值其实可以简化为一个参数:
--no-locale
通常不建议使用非C LOCALE的字符序设置,C LOCALE的字符序让数据库依赖于操作系统,LIKE模糊查询可使用到索引。
字符集及字符序设置是全局的只读变量,初始化设置完成后不可以修改,新建数据库时才可以重新指定。
查看支持的字符集以及字符序
数据库里可以使用哪些字符集以及与之搭配的字符序可通过如下语句查询PG_COLLATION系统数据字典表:
select pg_encoding_to_char(collencoding) as encoding,
collname,collcollate,collctype from pg_collation;
如果只查看数据库支持哪些字符集,可以在线查看openGauss的create database语法的encoding选项

查看字符集下字符占用的字节数
新建数据库并指定新的字符集:
create database db_utf8 encoding 'UTF8' lc_ctype 'C' lc_collate 'C' ;
create database db_gbk encoding 'GBK' lc_ctype 'C' lc_collate 'C' ;
在UTF8字符集下查看中英文字符占用的字节:英文1个字节,汉字3个字节
\c db_ut8
db_ut8=# select encode('a'::bytea,'hex'),encode('磐维'::bytea,'hex');
encode | encode
--------+--------------
61 | e7a390e7bbb4
(1 row)
在GBK字符集下查看中英文字符占用的字节:英文1个字节,汉字2个字节
db_gbk=# select encode('a'::bytea,'hex'),encode('磐维'::bytea,'hex');
encode | encode
--------+----------
61 | c5cdceac
(1 row)
与字符集相关的调优案例
问题概要
租户业务数据库采使用了GB18030字符集,⽽客户端openGauss JDBC程序默认使用UTF8编码,在使⽤默认 JDBC url连接串时,数据发送到数据库后,数据库服务端会针对数据进行UTF8到GB18030的转码工作,这产⽣了额外的处理时间,从⽽导致数据通过JDBC插入时效率较低。
解决⽅案
JDBC插入慢的问题,openGauss JDBC 5.1.0版本针对GB18030字符集进行了优化,可以通过升级驱动包及调整配置参数进行优化。
JDBC驱动包可以直接替换或通过修改pom.xml文件依赖,pom文件修改如下:
<!-- https://mvnrepository.com/artifact/org.opengauss/opengauss-jdbc -->
<dependency>
<groupId>org.opengauss</groupId>
<artifactId>opengauss-jdbc</artifactId>
<version>5.1.0-og</version>
<scope>provided</scope>
</dependency>
更新JDBC驱动版本后,url连接串参数再进行如下设置:
jdbc:opengauss://ip:port/database?characterEncoding=GB18030&allowEncodingChanges=true
租户测试环境模拟结果如下:
- JDBC 5.1.0 版本,开启相关参数,10万条模拟数据插⼊时间为22秒。
- JDBC 5.1.0 版本,不开启相关参数,10万条模拟数据插⼊时间为533秒。




