kingbase 字符集详解
字符集概念
KingbaseES数据库支持各种字符集(也叫编码)来存储文本,包括单字节字符集(如 ISO 8859 系列),以及多字节字符集(如 EUC “扩展 Unix 编码” 、UTF-8 和 Mule 内部编码)。 所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器方编码)。
默认的字符集是在使用 initdb初始化KingbaseES数据库集簇时选择的。在创建一个数据库时可以重载它,因此可能会有多个数据库并且每一个数据库使用不同的字符集。
但是,一个重要的限制是每个数据库的字符集必须和数据库的LC_CTYPE (字符分类)和LC_COLLATE (字符串排序顺序)设置兼容。对于 C或POSIX环境,任何字符集都是允许的, 但是对于其他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不是C或POSIX时,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字符集的支持情况。
| 名称 | 描述 | 语言 | 服务器端是否支持 | 是否支持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 | 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 | |
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,ShiftJIS, WIN932,Windows932 |
SHIFT_JIS_2004 |
Shift JIS, JIS X0213 | 日语 | 否 | 否 | 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 |
并非所有的客户端接口都支持以上字符集。如:JDBC 不支持MULE_INTERNAL、LATIN6、LATIN8和LATIN10。
SQL_ASCII字符集的设置和其它字符集的设置差别很大。 如果您设置的字符集是SQL_ASCII,服务器根据ASCII标准解析在0-127范围内的字节,但不能解析在128-255范围的字节,并且服务器也不会进行编码转换,基于此,SQL_ASCII不会用来做为编码的声明。 在大多数情况下,如果您使用了任何非ASCII数据,由于Kingbase不会转换或者校验非ASCII字符,因此建议不把字符集设置为 SQL_ASCII。
服务器和客户端字符集转换
KingbaseES支持在服务器和客户端之间的一些编码的自动转换。 转换信息在系统目录sys_conversion中存储。 KingbaseES默认支持一些字符集之间的转换,如表"客户端/服务器字符集转换"。 您也可以使用SQL命令CREATE CONVERSION创建一个新的转换。
浙公网安备 33010602011771号