字符集支持

Greenplum数据库中的字符集支持允许您以各种字符集存储文本,包括单字节字符集(如ISO 8859系列)和多字节字符集(如EUC(扩展Unix代码),UTF-8), 和Mule内部代码。 客户端可以透明地使用所有支持的字符集,但少数只能在服务器上使用(即作为一种服务器端编码)。 使用gpinitsystem初始化Greenplum数据库阵列时,会选择默认字符集。 创建数据库时可以覆盖它,因此您可以拥有多个数据库,每个数据库具有不同的字符集。

Table 1. Greenplum数据库字符集 1
名称描述语言是否服务端?字节/字符别名
BIG5Big Five繁体中文No1-2WIN950, Windows950
EUC_CNExtended UNIX Code-CN简体中文Yes1-3 
EUC_JPExtended UNIX Code-JP日文Yes1-3 
EUC_KRExtended UNIX Code-KR韩文Yes1-3 
EUC_TWExtended UNIX Code-TW繁体中文,台湾Yes1-3 
GB18030国家标准中文No1-2 
GBK扩展国标简体中文No1-2WIN936, Windows936
ISO_8859_5ISO 8859-5, ECMA 113Latin/CyrillicYes1 
ISO_8859_6ISO 8859-6, ECMA 114Latin/ArabicYes1 
ISO_8859_7ISO 8859-7, ECMA 118Latin/GreekYes1 
ISO_8859_8ISO 8859-8, ECMA 121Latin/HebrewYes1 
JOHABJOHAKorean (Hangul)Yes1-3 
KOI8KOI8-R(U)CyrillicYes1KOI8R
LATIN1ISO 8859-1, ECMA 94Western EuropeanYes1ISO88591
LATIN2ISO 8859-2, ECMA 94Central EuropeanYes1ISO88592
LATIN3ISO 8859-3, ECMA 94South EuropeanYes1ISO88593
LATIN4ISO 8859-4, ECMA 94North EuropeanYes1ISO88594
LATIN5ISO 8859-9, ECMA 128TurkishYes1ISO88599
LATIN6ISO 8859-10, ECMA 144NordicYes1ISO885910
LATIN7ISO 8859-13BalticYes1ISO885913
LATIN8ISO 8859-14CelticYes1ISO885914
LATIN9ISO 8859-15LATIN1 with Euro and accentsYes1ISO885915
LATIN10ISO 8859-16, ASRO SR 14111RomanianYes1ISO885916
MULE_INTERNALMule internal codeMultilingual EmacsYes1-4 
SJISShift JISJapaneseNo1-2Mskanji, ShiftJIS, WIN932, Windows932
SQL_ASCIIunspecified 2anyNo1 
UHCUnified Hangul CodeKoreanNo1-2WIN949, Windows949
UTF8Unicode, 8-bitallYes1-4Unicode
WIN866Windows CP866CyrillicYes1ALT
WIN874Windows CP874ThaiYes1 
WIN1250Windows CP1250Central EuropeanYes1 
WIN1251Windows CP1251CyrillicYes1WIN
WIN1252Windows CP1252Western EuropeanYes1 
WIN1253Windows CP1253GreekYes1 
WIN1254Windows CP1254TurkishYes1 
WIN1255Windows CP1255HebrewYes1 
WIN1256Windows CP1256ArabicYes1 
WIN1257Windows CP1257BalticYes1 
WIN1258Windows CP1258VietnameseYes1ABC, TCVN, TCVN5712, VSCII

Parent topic: Greenplum数据库参考指南

设置字符集

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

除了用作系统范围的默认值之外,您还可以创建具有不同字符集的数据库。例如:

  1. => CREATE DATABASE korean WITH ENCODING 'EUC_KR';

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

由于这些语言环境设置被gpinitsystem冻结,因此在不同数据库中使用不同编码的明显的灵活性更具理论性而非实用性。

安全使用多种编码的一种方法是在初始化期间将语言环境设置为C或POSIX,从而禁用任何真实的语言环境感知。

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

Greenplum数据库支持服务器和客户端之间针对特定字符集组合的自动字符集转换。 转换信息存储在master pg_conversion系统catalog表中。 Greenplum数据库附带了一些预定义的转换,或者您可以使用SQL命令CREATE CONVERSION创建新的转换。

Table 2. 客户端/服务器字符集转换
服务器字符集可用的客户端字符集
BIG5不支持作为服务器编码
EUC_CNEUC_CN, MULE_INTERNAL, UTF8
EUC_JPEUC_JP, MULE_INTERNAL, SJIS, UTF8
EUC_KREUC_KR, MULE_INTERNAL, UTF8
EUC_TWEUC_TW, BIG5, MULE_INTERNAL, UTF8
GB18030不支持作为服务器编码
GBK不支持作为服务器编码
ISO_8859_5ISO_8859_5, KOI8, MULE_INTERNAL, UTF8, WIN866, WIN1251
ISO_8859_6ISO_8859_6, UTF8
ISO_8859_7ISO_8859_7, UTF8
ISO_8859_8ISO_8859_8, UTF8
JOHABJOHAB, UTF8
KOI8KOI8, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
LATIN1LATIN1, MULE_INTERNAL, UTF8
LATIN2LATIN2, MULE_INTERNAL, UTF8, WIN1250
LATIN3LATIN3, MULE_INTERNAL, UTF8
LATIN4LATIN4, MULE_INTERNAL, UTF8
LATIN5LATIN5, UTF8
LATIN6LATIN6, UTF8
LATIN7LATIN7, UTF8
LATIN8LATIN8, UTF8
LATIN9LATIN9, UTF8
LATIN10LATIN10, UTF8
MULE_INTERNALMULE_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所有支持的编码
WIN866WIN866
ISO_8859_5KOI8, MULE_INTERNAL, UTF8, WIN1251
WIN874WIN874, UTF8
WIN1250WIN1250, LATIN2, MULE_INTERNAL, UTF8
WIN1251WIN1251, ISO_8859_5, KOI8, MULE_INTERNAL, UTF8, WIN866
WIN1252WIN1252, UTF8
WIN1253WIN1253, UTF8
WIN1254WIN1254, UTF8
WIN1255WIN1255, UTF8
WIN1256WIN1256, UTF8
WIN1257WIN1257, UTF8
WIN1258WIN1258, UTF8

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

  • 在psql中使用\encoding命令,它允许您动态更改客户端编码。
  • 使用 SET client_encoding TO.

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

    1. => SET CLIENT_ENCODING TO 'value';

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

    1. => SHOW client_encoding;

    要返回到默认编码:

    1. => RESET client_encoding;
  • 使用PGCLIENTENCODING环境变量。 在客户端环境中定义PGCLIENTENCODING时,将在与服务器建立连接时自动选择该客户端编码。 (这可以随后使用上面提到的任何其他方法覆盖。)

  • 设置配置参数client_encoding。 如果在master postgresql.conf文件中设置了client_encoding, 则在建立与Greenplum数据库的连接时会自动选择该客户端编码。 (这可以随后使用上面提到的任何其他方法覆盖。)

如果无法转换特定字符“假设您为服务器选择了EUC_JP而对客户端选择了LATIN1, 那么某些日文字符在LATIN1中没有表示”,则会报告错误。

如果客户端字符集定义为SQL_ASCII,则无论服务器的字符集如何,都将禁用编码转换。 除非使用all-ASCII数据,否则使用SQL_ASCII是不明智的。

1 并非所有API都支持所有列出的字符集。 例如,JDBC驱动程序不支持MULE_INTERNAL,LATIN6,LATIN8和LATIN10。

2 SQL_ASCII设置与其他设置的行为大不相同。 字节值0-127根据ASCII标准进行解释,字节值128-255作为未解释的字符。 如果使用任何非ASCII数据,则将SQL_ASCII设置用作客户端编码是不明智的。 不支持SQL_ASCII作为服务器编码。