7.3.?字符集支持

7.3.1. 被支持的字符集
7.3.2. 设置字符集
7.3.3. 服务器和客户端之间的自动字符集转换
7.3.4. 进一步阅读

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

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

7.3.1.?被支持的字符集

表?7.1显示了UXDB中可用的字符集。

表?7.1.?UXDB字符集

名称描述语言是否服务器端ICU字节/字符别名
BIG5Big Five繁体中文1-2WIN950, 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-2WIN936, Windows936
ISO_8859_5ISO 8859-5, ECMA 113拉丁语/西里尔语1?
ISO_8859_6ISO 8859-6, ECMA 114拉丁语/阿拉伯语1?
ISO_8859_7ISO 8859-7, ECMA 118拉丁语/希腊语1?
ISO_8859_8ISO 8859-8, ECMA 121拉丁语/希伯来语1?
JOHABJOHAB韩语1-3?
KOI8RKOI8-R西里尔语(俄语)1KOI8
KOI8UKOI8-U西里尔语(乌克兰语)1?
LATIN1ISO 8859-1, ECMA 94西欧1ISO88591
LATIN2ISO 8859-2, ECMA 94中欧1ISO88592
LATIN3ISO 8859-3, ECMA 94南欧1ISO88593
LATIN4ISO 8859-4, ECMA 94北欧1ISO88594
LATIN5ISO 8859-9, ECMA 128土耳其语1ISO88599
LATIN6ISO 8859-10, ECMA 144日耳曼语1ISO885910
LATIN7ISO 8859-13波罗的海1ISO885913
LATIN8ISO 8859-14凯尔特语1ISO885914
LATIN9ISO 8859-15带欧罗巴和口音的LATIN11ISO885915
LATIN10ISO 8859-16, ASRO SR 14111罗马尼亚语1ISO885916
MULE_INTERNALMule内部编码多语种编辑器1-4?
SJISShift JIS日语1-2Mskanji, ShiftJIS, WIN932, Windows932
SHIFT_JIS_2004Shift JIS, JIS X 0213日语1-2?
SQL_ASCII未指定(见文本)劝拿庞蜗菲教ㄗ⒉嵬锯1?
UHC统一韩语编码韩语1-2WIN949, Windows949
UTF8Unicode, 8-bit所有1-4Unicode
WIN866Windows CP866西里尔语1ALT
WIN874Windows CP874泰语1?
WIN1250Windows CP1250中欧1?
WIN1251Windows CP1251西里尔语1WIN
WIN1252Windows CP1252西欧1?
WIN1253Windows CP1253希腊语1?
WIN1254Windows CP1254土耳其语1?
WIN1255Windows CP1255希伯来语1?
WIN1256Windows CP1256阿拉伯语1?
WIN1257Windows CP1257波罗的海1?
WIN1258Windows CP1258越南语1ABC, TCVN, TCVN5712, VSCII

并非所有的客户端API都支持上面列出的字符集。比如,UXDB的JDBC 驱动就不支持MULE_INTERNALLATIN6LATIN8LATIN10

SQL_ASCII设置与其他设置表现得相当不同。如果服务器字符集是SQL_ASCII,服务器把字节值0-127根据 ASCII标准解释,而字节值128-255则当作无法解析的字符。如果设置为SQL_ASCII,就不会有编码转换。因此,这个设置基本不是用来声明所使用的指定编码, 因为这个声明会忽略编码。在大多数情况下,如果你使用了任何非ASCII数据,那么使用 SQL_ASCII设置都是不明智的,因为UXDB将无法帮助你转换或者校验非ASCII字符。

7.3.2.?设置字符集

initdbUXDB集群定义缺省的字符集(编码)。比如:

initdb -E EUC_JP

把缺省字符集设置为EUC_JP(用于日文的扩展Unix编码)。如果你喜欢用长选项字符串,你可以用--encoding代替-E。 如果没有给出-E或者--encoding选项,initdb会尝试基于指定的或者默认的区域判断要使用的合适编码。

你可以在数据库创建时指定一个非默认编码,提供的编码应和选择的区域兼容:

createdb -E EUC_KR -T template0 --lc-collate=ko_KR.euckr --lc-ctype=ko_KR.euckr korean

将创建一个使用EUC_KR字符集和ko_KR区域的名为korean的数据库。 另外一种实现方法是使用SQL命令:

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

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

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

$ uxsql -l
                                         List of databases
   Name    |  Owner   | Encoding  |  Collation  |    Ctype    |          Access Privileges
-----------+----------+-----------+-------------+-------------+-------------------------------------
 clocaledb |   uxdb   | SQL_ASCII | C           | C           |
 englishdb |   uxdb   | UTF8      | en_GB.UTF8  | en_GB.UTF8  |
 japanese  |   uxdb   | UTF8      | ja_JP.UTF8  | ja_JP.UTF8  |
 korean    |   uxdb   | EUC_KR    | ko_KR.euckr | ko_KR.euckr |
 uxdb      |   uxdb   | UTF8      | fi_FI.UTF8  | fi_FI.UTF8  |
 template0 |   uxdb   | UTF8      | fi_FI.UTF8  | fi_FI.UTF8  | {=c/uxdb,uxdb=CTc/uxdb}
 template1 |   uxdb   | UTF8      | fi_FI.UTF8  | fi_FI.UTF8  | {=c/uxdb,uxdb=CTc/uxdb}
(7 rows)

重要

在大多数现代操作系统中,UXDB可以通过LC_CTYPE的设置决定使用哪种字符集,并且强制只使用匹配的数据库编码。在旧的操作系统上有责任确保使用所选区域所期望的编码。如果这上面犯错误很可能导致与区域相关的操作表现出奇怪的行为,例如排序。

即使当LC_CTYPE不是CPOSIX时,UXDB也允许超级用户使用SQL_ASCII编码创建数据库。正如以上所述,SQL_ASCII不强制存储在数据库中的数据具有任何特定的编码,所以这个选择存在区域相关的不当行为的风险。使用这样的设置组合是不推荐的,将来可能会被完全禁止。

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

UXDB支持一些编码在服务器和前端之间的自动编码转换。转换信息在系统目录ux_conversion中存储。UXDB带着一些预定义的转换,如表?7.2所示。你可以使用SQL命令CREATE CONVERSION创建一个新的转换。

表?7.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, KOI8R, 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
KOI8RKOI8R, ISO_8859_5, MULE_INTERNAL, UTF8, WIN866, WIN1251
KOI8UKOI8U, UTF8
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, KOI8R, LATIN1 to LATIN4, SJIS, WIN866, WIN1250, WIN1251
SJIS不支持作为一个服务器编码
SQL_ASCII劝拿庞蜗菲教ㄗ⒉嵬锯(不会执行任何转换)
UHC不支持作为一个服务器编码
UTF8所有支持的编码
WIN866WIN866, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN1251
WIN874WIN874, UTF8
WIN1250WIN1250, LATIN2, MULE_INTERNAL, UTF8
WIN1251WIN1251, ISO_8859_5, KOI8R, MULE_INTERNAL, UTF8, WIN866
WIN1252WIN1252, UTF8
WIN1253WIN1253, UTF8
WIN1254WIN1254, UTF8
WIN1255WIN1255, UTF8
WIN1256WIN1256, UTF8
WIN1257WIN1257, UTF8
WIN1258WIN1258, UTF8

要想启用自动字符集转换功能,你必须告诉UXDB你想在客户端使用的字符集(编码)。你可以用多种方法来完成:

  • uxsql里的\encoding命令。\encoding允许你动态修改客户端编码。比如,把编码改变为SJIS,键入:

    \encoding SJIS

  • libpq中提供函数控制客户端编码。

  • 使用SET client_encoding TO。 可以使用这个SQL命令设置客户端编码:

    SET CLIENT_ENCODING TO 'value';

    你还可以把标准SQL语法里的SET NAMES用于这个目的:

    SET NAMES 'value';

    要查询当前客户端编码:

    SHOW client_encoding;

    要返回到缺省编码:

    RESET client_encoding;

  • 使用UXCLIENTENCODING。如果在客户端的环境里定义了UXCLIENTENCODING环境变量, 那么在与服务器进行了连接后将自动选择客户端编码(这个设置随后可以用上文提到的任何其他方法重载)。

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

假如无法进行一个特定字符的转换 — 假如你选的服务器编码是EUC_JP而客户端是LATIN1,那么有些日文字符不能转换成LATIN1 — 将会报告一个错误。

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

7.3.4.?进一步阅读

下面是学习各种类型的编码系统的好资源。

CJKV Information Processing: Chinese, Japanese, Korean & Vietnamese Computing

包含对EUC_JPEUC_CNEUC_KREUC_TW的详细解释。

http://www.unicode.org/

Unicode联盟的网站。

RFC 3629

UTF-8 (8-bit UCS/Unicode转换格式)在这里定义。

XML 地图 | Sitemap 地图