字符集支持

字符集支持

Greenplum数据库里面的字符集支持用户能够以各种字符集存储文本,包括单字节字符集, 比如 ISO 8859 系列,以及多字节字符集 ,比如EUC(扩展 Unix 编码 Extended Unix Code)、UTF-8 和 Mule 内部编码。 所有被支持的字符集都可以被客户端透明地使用,但少数只能在服务器上使用(即作为一种服务器端编码)。 初始化用户的Greenplum数据库数组时,会选择默认字符集 gpinitsystem。 在用户创建一个数据库时可以重载它,因此用户可能会有多个数据库并且每一个使用不同的字符集。

表 1. Greenplum数据库字符集 1
名称 描述 语言 是否服务器端? 字节/字符 别名
BIG5 Big Five 繁体中文 No 1-2 WIN950, Windows950
EUC_CN Extended UNIX Code-CN 简体中文 Yes 1-3  
EUC_JP Extended UNIX Code-JP 日文 Yes 1-3  
EUC_KR Extended UNIX Code-KR 韩文 Yes 1-3  
EUC_TW Extended UNIX Code-TW 繁体中文,台湾 Yes 1-3  
GB18030 国家标准 中文 No 1-2  
GBK 扩展国标 简体中文 No 1-2 WIN936, Windows936
ISO_8859_5 ISO 8859-5, ECMA 113 Latin/Cyrillic Yes 1  
ISO_8859_6 ISO 8859-6, ECMA 114 Latin/Arabic Yes 1  
ISO_8859_7 ISO 8859-7, ECMA 118 Latin/Greek Yes 1  
ISO_8859_8 ISO 8859-8, ECMA 121 Latin/Hebrew Yes 1  
JOHAB JOHA Korean (Hangul) Yes 1-3  
KOI8 KOI8-R(U) Cyrillic Yes 1 KOI8R
LATIN1 ISO 8859-1, ECMA 94 Western European Yes 1 ISO88591
LATIN2 ISO 8859-2, ECMA 94 Central European Yes 1 ISO88592
LATIN3 ISO 8859-3, ECMA 94 South European Yes 1 ISO88593
LATIN4 ISO 8859-4, ECMA 94 North European Yes 1 ISO88594
LATIN5 ISO 8859-9, ECMA 128 Turkish Yes 1 ISO88599
LATIN6 ISO 8859-10, ECMA 144 Nordic Yes 1 ISO885910
LATIN7 ISO 8859-13 Baltic Yes 1 ISO885913
LATIN8 ISO 8859-14 Celtic Yes 1 ISO885914
LATIN9 ISO 8859-15 LATIN1 with Euro and accents Yes 1 ISO885915
LATIN10 ISO 8859-16, ASRO SR 14111 Romanian Yes 1 ISO885916
MULE_INTERNAL Mule internal code Multilingual Emacs Yes 1-4  
SJIS Shift JIS Japanese No 1-2 Mskanji, ShiftJIS, WIN932, Windows932
SQL_ASCII unspecified 2 any No 1  
UHC Unified Hangul Code Korean No 1-2 WIN949, Windows949
UTF8 Unicode, 8-bit all Yes 1-4 Unicode
WIN866 Windows CP866 Cyrillic Yes 1 ALT
WIN874 Windows CP874 Thai Yes 1  
WIN1250 Windows CP1250 Central European Yes 1  
WIN1251 Windows CP1251 Cyrillic Yes 1 WIN
WIN1252 Windows CP1252 Western European Yes 1  
WIN1253 Windows CP1253 Greek Yes 1  
WIN1254 Windows CP1254 Turkish Yes 1  
WIN1255 Windows CP1255 Hebrew Yes 1  
WIN1256 Windows CP1256 Arabic Yes 1  
WIN1257 Windows CP1257 Baltic Yes 1  
WIN1258 Windows CP1258 Vietnamese Yes 1 ABC, TCVN, TCVN5712, VSCII

设置字符集

gpinitsystem通过在初始化时间读取gp_init_config 文件中的 ENCODING参数的设置来定义Greenplum数据库系统的默认字符集。 默认的字符集是UNICODEUTF8.

除了用作系统级默认值之外,还可以创建一个不同字符集的数据库。例如:

=> CREATE DATABASE korean WITH ENCODING 'EUC_KR';

重点: 虽然用户可以指定数据库所需的任何编码, 但选择不是用户所选择的语言环境所期望的编码是不明智的。该LC_COLLATELC_CTYPE设置意味着特定的编码,并且依赖于区域设置的操作(例如排序)可能会误解处于不兼容编码的数据。

由于这些区域设置被gpin系统冻结,因此在不同数据库中使用不同编码的灵活性明显比实际更理论

一种安全使用多个编码的方法是在初始化时间内将语言环境设置为CPOSIX ,从而禁止任何真正的区域意识。

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

Greenplum数据库支持服务器和客户端之间的某些字符集组合的自动字符集转换。 转换信息存储在主 pg_conversion系统目录表中。 Greenplum数据库带有一些预定义的转换,或者用户可以使用SQL命令创建一个新的转换CREATE CONVERSION.

表 2. 客户端/服务器字符集转换
服务器字符集 可用的客户端字符集
BIG5 不支持作为服务器编码
EUC_CN EUC_CN, MULE_INTERNAL, UTF8
EUC_JP EUC_JP, MULE_INTERNAL, SJIS, UTF8
EUC_KR EUC_KR, MULE_INTERNAL, UTF8
EUC_TW EUC_TW, BIG5, MULE_INTERNAL, UTF8
GB18030 不支持作为服务器编码
GBK 不支持作为服务器编码
ISO_8859_5 ISO_8859_5, KOI8, MULE_INTERNAL, UTF8, WIN866, WIN1251
ISO_8859_6 ISO_8859_6, UTF8
ISO_8859_7 ISO_8859_7, UTF8
ISO_8859_8 ISO_8859_8, UTF8
JOHAB JOHAB, UTF8
KOI8 KOI8, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
LATIN1 LATIN1, MULE_INTERNAL, UTF8
LATIN2 LATIN2, MULE_INTERNAL, UTF8, WIN1250
LATIN3 LATIN3, MULE_INTERNAL, UTF8
LATIN4 LATIN4, MULE_INTERNAL, UTF8
LATIN5 LATIN5, UTF8
LATIN6 LATIN6, UTF8
LATIN7 LATIN7, UTF8
LATIN8 LATIN8, UTF8
LATIN9 LATIN9, UTF8
LATIN10 LATIN10, UTF8
MULE_INTERNAL MULE_INTERNAL, BIG5, EUC_CN, EUC_JP, EUC_KR, EUC_TW, ISO_8859_5, KOI8, LATIN1 to LATIN4, SJIS, WIN866, WIN1250, WIN1251
SJIS 不支持作为服务器编码
SQL_ASCII 不支持作为服务器编码
UHC 不支持作为服务器编码
UTF8 所有支持的编码
WIN866 WIN866
ISO_8859_5 KOI8, MULE_INTERNAL, UTF8, WIN1251
WIN874 WIN874, UTF8
WIN1250 WIN1250, LATIN2, MULE_INTERNAL, UTF8
WIN1251 WIN1251, ISO_8859_5, KOI8, MULE_INTERNAL, UTF8, WIN866
WIN1252 WIN1252, UTF8
WIN1253 WIN1253, UTF8
WIN1254 WIN1254, UTF8
WIN1255 WIN1255, UTF8
WIN1256 WIN1256, UTF8
WIN1257 WIN1257, UTF8
WIN1258 WIN1258, UTF8

要启用自动字符集转换,用户必须告诉Greenplum数据库用户要在客户端中使用的字符集(编码)。有几种方法可以实现这一点:

  • 使用\encoding 命令在psql中, 它允许用户即时更改客户端编码。
  • 使用SETclient_encoding TO

    要设置客户端编码,请使用以下SQL命令:

    => SET CLIENT_ENCODING TO 'value';

    要查询当前的客户端编码:

    => SHOW client_encoding;

    要返回到默认编码:

    => RESET client_encoding;
  • 使用PGCLIENTENCODING 环境变量。当在客户端的环境变量定义为 PGCLIENTENCODING 时,与服务器建立连接时会自动选择该客户端编码。(这可以随后使用上述其他任何方法重写)
  • 设置配置参数client_encoding。 如果client_encoding被设置为主 postgresql.conf 文件,当建立与Greenplum数据库的连接时,会自动选择该客户端编码。 (这可以随后使用上述其他任何方法重写。)

如果特定字符的转换是不可能的 " 假设 用户为服务器选择了 EUC_JP 而为客户端选择了 LATIN1 则一些日文字符在LATIN1 没有表现形式" 则会报告错误。

如果客户端字符集被定义为SQL_ASCII, 无论服务器的字符集如何,禁止编码转换。 除非用户使用所有ASCII数据,否则SQL_ASCII 是不明智的。 不支持SQL_ASCII 作为服务器编码。

1 并非所有API都支持所有列出的字符集。例如,JDBC驱动程序不支持MULE_INTERNAL,LATIN6,LATIN8和LATIN10。
2 SQL_ASCII设置与其他设置的行为大不相同。字节值0-127根据ASCII标准进行解释,字节值128-255作为未解释的字符。如果使用任何非ASCII数据,则将SQL_ASCII设置用作客户端编码是不明智的。不支持SQL_ASCII作为服务器编码。