kingbase 字符集详解

字符集概念

KingbaseES数据库支持各种字符集(也叫编码)来存储文本,包括单字节字符集(如 ISO 8859 系列),以及多字节字符集(如 EUC “扩展 Unix 编码” 、UTF-8 和 Mule 内部编码)。 所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器方编码)。

默认的字符集是在使用 initdb初始化KingbaseES数据库集簇时选择的。在创建一个数据库时可以重载它,因此可能会有多个数据库并且每一个数据库使用不同的字符集。

但是,一个重要的限制是每个数据库的字符集必须和数据库的LC_CTYPE (字符分类)和LC_COLLATE (字符串排序顺序)设置兼容。对于 CPOSIX环境,任何字符集都是允许的, 但是对于其他libc提供的环境只有一种字符集可以正确工作(不过,在Windows上UTF-8编码可以和任何环境配合使用)。 如果配置了ICU支持,则ICU提供的区域设置可用于大多数服务器端编码。

字符集的配置

initdb为KingbaseES数据库定义一个缺省的字符集(编码)。

例如,将缺省字符集设置为UTF-8

./initdb -E UTF-8 -D data
 

如果喜欢用长选项字符串,可以用--encoding代替-E

如果没有指定-E或者--encoding选项,initdb会尝试基于指定的或者默认的区域判断要使用的合适编码。

可以在创建数据库时指定一个非默认编码,提供的编码应和选择的区域兼容。如下面的例子,创建一个名为korean的数据库,该数据库使用EUC_KR字符集和ko_KR区域设置:

./createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean -U system -p 54321
 

另外一种实现方法是使用SQL 命令:

CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr'
LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
 

注意上述命令指定拷贝template0数据库。在拷贝任何其他数据库时,不能更改从源数据库得来的编码和区域设置,因为这可能会导致数据受损。

数据库的编码存储在系统目录sys_database中。你可以使用ksql -l选项或者\l命令来查看。

$ ./ksql -U system -d test -l
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-----------+--------+----------+-------------+-------------+-------------------
kingbase | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
korean | system | EUC_KR | ko_KR.euckr | ko_KR.euckr |
security | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
template0 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/system +
| | | | | system=CTc/system
template1 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 | =c/system +
| | | | | system=CTc/system
test | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(6 rows)
 
备注

在大部分现代操作系统上,KingbaseES可以判断LC_CTYPE设置哪一种隐含的字符集,并且它将强制只使用匹配的数据库编码。在版本过旧的系统上需要自己负责确保所使用的编码就是所设置的区域。这里的一个错误很可能导致区域依赖的操作产生奇怪的行为,例如排序。

即使LC_CTYPE不是CPOSIX时,KingbaseES也允许超级用户使用SQL_ASCII编码创建数据库。

服务器和客户端之间的自动字符集转换

KingbaseES支持服务器和客户端之间的自动编码转换。如果选择的数据库字符集不同于客户端操作系统上的字符集,那么KingbaseES数据库可以将操作系统字符集转换为数据库字符集。

转换信息存储在系统目录sys_conversion。可以使用SQL命令CREATE CONVERSION创建一个新的转换。

要想启用自动字符集转换功能,必须告诉KingbaseES在客户端使用的字符集(编码)。

可以采用以下几种方法来启用自动字符集转换功能:

  • 采用ksql里的\encoding命令。\encoding允许动态修改客户端编码。例如,将编码改变为UTF8

    \encoding UTF8
     
  • 使用SQL命令SET client_encoding TO 设置客户端编码:

    SET CLIENT_ENCODING TO 'UTF8';
     

    还可以采用标准SQL语法里的SET NAMES来设置:

    SET NAMES 'UTF8';
     

    查询当前客户端编码:

    SHOW client_encoding;
     

    返回到缺省编码:

    RESET client_encoding;
     
  • 使用 KINGBASE_CLIENTENCODING 。如果在客户端环境里定义了KINGBASE_CLIENTENCODING环境变量,那么在与服务器进行了连接后将自动选择该编码(随后可以用上述提到的方法重载)。

  • 使用配置变量 client_encoding 。如果设置了client_encoding变量,客户端在与服务器建立了连接之后,客户端编码将被自动选定(随后可以用上述提到的方法重载)。

如果无法转换特定的字符,则会报错,如选的服务器编码是EUC_JP,而客户端是LATIN1,那么部分日文字符不能被转换成LATIN1 。

如果客户端字符集定义成了SQL_ASCII,无论服务器的字符集是什么,编码转换都将被禁用。和服务器一样,使用SQL_ASCII是不明智的,除非你的工作环境全部是 ASCII 数据。

KingbaseES支持的字符集

表"KingbaseES字符集"显示了KingbaseES字符集的支持情况。

KingbaseES字符集
名称描述语言服务器端是否支持是否支持ICU字节/字符别名
BIG5 BigFive 繁体中文 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  
GBK 扩展国家标准 简体中文 1-2 WIN936Windows936
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  
ISO_8859_8 ISO 8859-8, ECMA 121 拉丁语/ 希伯来语 1  
JOHAB JOHAB 韩语 1-3  
KOI8R KOI8-R 西里尔语 (俄语) 1 KOI8
KOI8U KOI8-U 西里尔语 (乌克兰语) 1  
LATIN1 ISO 8859-1, ECMA 94 西欧 1 ISO 88591
LATIN2 ISO 8859-2, ECMA 94 中欧 1 ISO 88592
LATIN3 ISO 8859-3, ECMA 94 南欧 1 ISO 88593
LATIN4 ISO 8859-4, ECMA 94 北欧 1 ISO 88594
LATIN5 ISO 8859-9, ECMA 128 土耳其语 1 ISO 88599
LATIN6 ISO 8859-10, ECMA 144 日耳曼语 1 ISO 885910
LATIN7 ISO 8859-13 波罗的海 1 ISO 885913
LATIN8 ISO 8859-14 凯尔特语 1 ISO 885914
LATIN9 ISO 8859-15 带欧罗巴和 口音的LATIN1 1 ISO 885915
LATIN10 ISO 8859-16, ASRO SR14111 罗马 尼亚语 1 ISO 885916
MULE_INTERNAL Mule内部编码 多语种编辑器 1-4  
SJIS Shift JIS 日语 1-2 Mskanji,ShiftJISWIN932,Windows932
SHIFT_JIS_2004 Shift JIS, JIS X0213 日语 1-2  
SQL_ASCII 未指定 任意 1  
UHC 统一韩语编码 韩语 1-2 WIN949Windows949
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,TCVNTCVN5712,VSCII
备注

并非所有的客户端接口都支持以上字符集。如:JDBC 不支持MULE_INTERNALLATIN6LATIN8LATIN10

SQL_ASCII字符集的设置和其它字符集的设置差别很大。 如果您设置的字符集是SQL_ASCII,服务器根据ASCII标准解析在0-127范围内的字节,但不能解析在128-255范围的字节,并且服务器也不会进行编码转换,基于此,SQL_ASCII不会用来做为编码的声明。 在大多数情况下,如果您使用了任何非ASCII数据,由于Kingbase不会转换或者校验非ASCII字符,因此建议不把字符集设置为 SQL_ASCII

服务器和客户端字符集转换

KingbaseES支持在服务器和客户端之间的一些编码的自动转换。 转换信息在系统目录sys_conversion中存储。 KingbaseES默认支持一些字符集之间的转换,如表"客户端/服务器字符集转换"。 您也可以使用SQL命令CREATE CONVERSION创建一个新的转换。

posted @ 2026-07-30 09:30  网络大法师  阅读(4)  评论(0)    收藏  举报