GaussDB 数据库字符编码与兼容模式
一、问题现象
华为云GaussDB数据库兼容4种数据库类型,在创建数据库之前要确认清楚兼容数据库的类型与字符编码。比如在mysql5.7以上支持insert on duplicate key update SQL语法,若在GaussDB集中式环境创建数据库时默认为O数据库,针对O类型数据库不支持上面mysql5.7 SQL语法,执行时会产生SQL错误,这篇技术文章为了详细说明GaussDB支持的兼容数据库与字符编码。
二、技术背景
GaussDB创建一个新的数据库。缺省情况下新数据库将通过复制标准系统数据库template0来创建,且仅支持使用template0来创建。
• 场景1:集中式创建库语法:
CREATE DATABASE database_name
[ [ WITH ] { [ OWNER [=] user_name ] |
[ TEMPLATE [=] template ] |
[ ENCODING [=] 'encoding' ] |
[ LC_COLLATE [=] 'lc_collate' ] |
[ LC_CTYPE [=] 'lc_ctype' ] |
[ DBCOMPATIBILITY [=] 'compatibilty_type' ] |
[ TABLESPACE [=] tablespace_name ] |
[ CONNECTION LIMIT [=] connlimit ] |
[ DBTIMEZONE [=] 'time_zone' ]}[...] ];
ENCODING参数为可选,指定数据库使用的字符编码,可以是字符串(如'SQL_ASCII')、整数编号。不指定时,默认使用模版数据库的编码。模板数据库template0和template1的编码默认与操作系统环境相关。template1不允许修改字符编码,因此若要变更编码,请使用template0创建数据库。常用取值:GBK、UTF8、Latin1、GB18030等,具体支持的字符集如下。
表1 GaussDB KernelopenGaussGaussDB字符集
名称 |
描述 |
语言 |
是否服务器端 |
ICU(International Components for Unicode) |
字节/字符 |
别名 |
BIG5 |
Big Five |
繁体中文 |
否 |
否 |
1-2 |
WIN950, Windows950 |
EUC_CN |
扩展UNIX编码-中国 |
简体中文 |
是 |
是 |
1-3 |
- |
EUC_JP |
扩展UNIX编码-日本 |
日文 |
是 |
是 |
1-3 |
- |
EUC_JIS_2004 |
扩展UNIX编码-日本, JIS X 0213 |
日文 |
是 |
否 |
1-3 |
- |
EUC_KR |
扩展UNIX编码-韩国 |
韩文 |
是 |
是 |
1-3 |
- |
EUC_TW |
扩展UNIX编码-中国台湾 |
繁体中文 |
是 |
是 |
1-3 |
- |
GB18030 |
国家标准 |
中文 |
是 |
否 |
1-4 |
- |
GB18030_2022 |
国家标准 |
中文 |
是 |
否 |
1-4 |
- |
GBK |
扩展国家标准 |
简体中文 |
是 |
否 |
1-2 |
WIN936, Windows936 |
ISO_8859_5 |
ISO 8859-5, ECMA 113 |
拉丁语/西里尔语 |
是 |
是 |
1 |
- |
ISO_8859_6 |
ISO 8859-6, ECMA 114 |
拉丁语/阿拉伯语 |
是 |
是 |
1 |
- |
ISO_8859_7 |
ISO 8859-7, ECMA 118 |
拉丁语/希腊语 |
是 |
是 |
1 |
- |
LATIN8 |
ISO 8859-14 |
凯尔特语 |
是 |
是 |
1 |
ISO885914 |
LATIN9 |
ISO 8859-15 |
带欧罗巴和口音的LATIN1 |
是 |
是 |
1 |
ISO885915 |
LATIN10 |
ISO 8859-16, ASRO SR 14111 |
罗马尼亚语 |
是 |
否 |
1 |
ISO885916 |
MULE_INTERNAL |
Mule内部编码 |
多语种编辑器 |
是 |
否 |
1-4 |
- |
SJIS |
Shift JIS |
日语 |
否 |
否 |
1-2 |
Mskanji, ShiftJIS, WIN932, Windows932 |
SHIFT_JIS_2004 |
Shift JIS, JIS X 0213 |
日语 |
否 |
否 |
1-2 |
- |
SQL_ASCII |
未指定(见文本) |
任意 |
是 |
否 |
1 |
- |
UHC |
统一韩语编码 |
韩语 |
否 |
否 |
1-2 |
WIN949, Windows949 |
UTF8 |
Unicode, 8-bit |
所有 |
是 |
是 |
1-4 |
Unicode |
WIN866 |
Windows CP866 |
西里尔语 |
是 |
是 |
1 |
ALT |
WIN874 |
Windows CP874 |
泰语 |
是 |
否 |
1 |
- |
WIN1250 |
Windows CP1250 |
中欧 |
是 |
是 |
1 |
- |
WIN1251 |
Windows CP1251 |
西里尔语 |
是 |
是 |
1 |
WIN |
WIN1252 |
Windows CP1252 |
西欧 |
是 |
是 |
1 |
- |
WIN1253 |
Windows CP1253 |
希腊语 |
是 |
是 |
1 |
- |
WIN1254 |
Windows CP1254 |
土耳其语 |
是 |
是 |
1 |
- |
WIN1255 |
Windows CP1255 |
希伯来语 |
是 |
是 |
1 |
- |
WIN1256 |
Windows CP1256 |
阿拉伯语 |
是 |
是 |
1 |
- |
WIN1257 |
Windows CP1257 |
波罗的海 |
是 |
是 |
1 |
- |
WIN1258 |
Windows CP1258 |
越南语 |
是 |
是 |
1 |
ABC, TCVN, TCVN5712, VSCII |
ZHS16GBK |
扩展国家标准 |
简体中文 |
是 |
否 |
1-2 |
- |
DBCOMPATIBILITY 可选参数。指定兼容的数据库的类型,默认兼容O。取值范围:A、B、C、PG。分别表示兼容O、MY、TD和POSTGRES。
• 场景2:分布式GausssDB创建库语法
创建库语法跟集式式是一样的,支持的字符编码也一样。区别在于DBCOMPATIBILITY兼容性参数值不一样:DBCOMPATIBILITY也为可选参数,指定兼容的数据库的类型,默认兼容MySQL。取值范围:MYSQL、TD、ORA、PG。分别表示兼容MySQL、TD(Teradata)、Oracle和PostgreSQL。
三、处理过程
因业务需求分别在GaussDB集中式与分布式环境下,创建GB18030的字符编码并且兼容Oracle数据库,本实例以fx为库名,处理过程以下:
• 集中式:
[omm@db01 ~]$ gsql -d postgres -p 30100 -ar
gaussdb=# create database fx encoding 'GB18030' dbcompatibility='A';
CREATE DATABASE
gaussdb=# select datname, pg_encoding_to_char(encoding),datcompatibility from pg_database where datname='fx';
datname | pg_encoding_to_char | datcompatibility
---------+---------------------+------------------
fx | GB18030 | A
(1 row)
gaussdb=#
• 分布式:
gaussdb=> create database fx encoding 'GB18030' dbcompatibility='ORA';
CREATE DATABASE
gaussdb=> select datname, pg_encoding_to_char(encoding),datcompatibility from pg_database where datname='fx';
datname | pg_encoding_to_char | datcompatibility
---------+---------------------+------------------
fx | GB18030 | ORA
(1 row)
gaussdb=>
四、总结
使用GaussDB数据库创建数据库前,需要按照业务场景确认数据库采用的字符编码与数据库兼容模式,特别是在做应用适配时确认源库的字符编码与源库的数据类型。
- 点赞
- 收藏
- 关注作者
评论(0)