PostgreSQL 10.1 手册_部分 III. 服务器管理_第 23 章 本地化_23.3. 字符集支持

简介: 23.3. 字符集支持 23.3.1. 被支持的字符集 23.3.2. 设置字符集 23.3.3. 服务器和客户端之间的自动字符集转换 23.3.4. 进一步阅读 PostgreSQL里面的字符集支持你能够以各种字符集存储文本,包括单字节字符集,比如 ISO 8859 系列,以及多字节字符集 ,比如EUC(扩展 Unix 编码 Extended Unix Code)、UTF-8 和 Mule 内部编码。
+关注继续查看

23.3. 字符集支持

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

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

23.3.1. 被支持的字符集

表 23.1显示了PostgreSQL中可用的字符集。

表 23.1. PostgreSQL字符集

名称 描述 语言 是否服务器端? ICU? 字节/字符 别名
BIG5 Big Five 繁体中文 1-2 WIN950Windows950
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 ISO88591
LATIN2 ISO 8859-2, ECMA 94 中欧 1 ISO88592
LATIN3 ISO 8859-3, ECMA 94 南欧 1 ISO88593
LATIN4 ISO 8859-4, ECMA 94 北欧 1 ISO88594
LATIN5 ISO 8859-9, ECMA 128 土耳其语 1 ISO88599
LATIN6 ISO 8859-10, ECMA 144 日耳曼语 1 ISO885910
LATIN7 ISO 8859-13 波罗的海 1 ISO885913
LATIN8 ISO 8859-14 凯尔特语 1 ISO885914
LATIN9 ISO 8859-15 带欧罗巴和口音的LATIN1 1 ISO885915
LATIN10 ISO 8859-16, ASRO SR 14111 罗马尼亚语 1 ISO885916
MULE_INTERNAL Mule内部编码 多语种编辑器 1-4  
SJIS Shift JIS 日语 1-2 MskanjiShiftJISWIN932Windows932
SHIFT_JIS_2004 Shift JIS, JIS X 0213 日语 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 ABCTCVNTCVN5712VSCII

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

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

23.3.2. 设置字符集

initdb为一个PostgreSQL集簇定义缺省的字符集(编码)。比如:

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数据库。在拷贝任何其他数据库时,不能更改从源数据库得来的编码和区域设置,因为这可能会导致破坏数据。详见第 22.3 节

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

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

重要

在大部分现代操作系统上,PostgreSQL可以判断LC_CTYPE设置意味着哪一种字符集,并且它强制只有匹配的数据库编码被使用。在老的系统上你需要自己负责确保所使用的编码就是你所选择的区域所期望的。在这里的一个错误很可能导致区域依赖的操作产生奇怪的行为,例如排序。

即使LC_CTYPE不是CPOSIX时,PostgreSQL将允许超级用户使用SQL_ASCII编码创建数据库。正如前文所述,SQL_ASCII并不强制存储在数据库中的数据具有任何特定的编码,并且这样这种选择存在着区域依赖的不正当行为的风险。使用这种设置组合的做法已经被废弃,并且在某天将被完全禁止。

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

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

表 23.2. 客户/服务器字符集转换

服务器字符集 可用的客户端字符集
BIG5 不支持作为一个服务器编码
EUC_CN EUC_CNMULE_INTERNALUTF8
EUC_JP EUC_JPMULE_INTERNALSJISUTF8
EUC_KR EUC_KRMULE_INTERNALUTF8
EUC_TW EUC_TWBIG5MULE_INTERNALUTF8
GB18030 不支持作为一个服务器编码
GBK 不支持作为一个服务器编码
ISO_8859_5 ISO_8859_5KOI8RMULE_INTERNALUTF8WIN866WIN1251
ISO_8859_6 ISO_8859_6UTF8
ISO_8859_7 ISO_8859_7UTF8
ISO_8859_8 ISO_8859_8UTF8
JOHAB JOHABUTF8
KOI8R KOI8RISO_8859_5MULE_INTERNALUTF8WIN866WIN1251
KOI8U KOI8UUTF8
LATIN1 LATIN1MULE_INTERNALUTF8
LATIN2 LATIN2MULE_INTERNALUTF8WIN1250
LATIN3 LATIN3MULE_INTERNALUTF8
LATIN4 LATIN4MULE_INTERNALUTF8
LATIN5 LATIN5UTF8
LATIN6 LATIN6UTF8
LATIN7 LATIN7UTF8
LATIN8 LATIN8UTF8
LATIN9 LATIN9UTF8
LATIN10 LATIN10UTF8
MULE_INTERNAL MULE_INTERNALBIG5EUC_CNEUC_JPEUC_KREUC_TWISO_8859_5KOI8RLATIN1 to LATIN4SJISWIN866WIN1250WIN1251
SJIS 不支持作为一个服务器编码
SQL_ASCII 任意(不会执行任何转换)
UHC 不支持作为一个服务器编码
UTF8 所有支持的编码
WIN866 WIN866ISO_8859_5KOI8RMULE_INTERNALUTF8WIN1251
WIN874 WIN874UTF8
WIN1250 WIN1250LATIN2MULE_INTERNALUTF8
WIN1251 WIN1251ISO_8859_5KOI8RMULE_INTERNALUTF8WIN866
WIN1252 WIN1252UTF8
WIN1253 WIN1253UTF8
WIN1254 WIN1254UTF8
WIN1255 WIN1255UTF8
WIN1256 WIN1256UTF8
WIN1257 WIN1257UTF8
WIN1258 WIN1258UTF8

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

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

    \encoding SJIS

  • libpq(见第 33.10 节)中提供函数控制客户端编码。

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

    SET CLIENT_ENCODING TO 'value';

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

    SET NAMES 'value';

    要查询当前客户端编码:

    SHOW client_encoding;

    要返回到缺省编码:

    RESET client_encoding;

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

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

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

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

23.3.4. 进一步阅读

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

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

包含对EUC_JP、 EUC_CNEUC_KR、 EUC_TW的详细解释。

http://www.unicode.org/

Unicode联盟的网站。

RFC 3629

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

本文转自PostgreSQL中文社区,原文链接:23.3. 字符集支持

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
相关文章
|
5月前
|
监控 网络协议 安全
PostgreSQL 12 文档: 部分 III. 服务器管理
部分 III. 服务器管理 这部份覆盖了PostgreSQL数据库管理员感兴趣的主题。包括软件安装、搭建和配置一个服务器、管理用户和数据库以及维护任务。任何想要运行一个PostgreSQL服务器的人(即使是用于个人用途而不是生产环境),应该熟悉这一部分覆盖的主题。 这部份的信息大致上按照一个新用户会阅读的顺序来安排。但是章节都是自组织的并且可以根据需要独立阅读。这一部分的信息也是按照叙事风格组织的。需要一个特定命令的完整描述的读者应该看看第 VI 部分。
40 0
|
监控 安全 测试技术
PostgreSQL 10.1 手册_部分 III. 服务器管理
部分 III. 服务器管理 这部份覆盖了PostgreSQL数据库管理员感兴趣的主题。包括软件安装、搭建和配置一个服务器、管理用户和数据库以及维护任务。任何想要运行一个PostgreSQL服务器的人(即使是用于个人用途而不是生产环境),应该熟悉这一部分覆盖的主题。
1556 0
|
SQL 关系型数据库 测试技术
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试
第 32 章 回归测试 目录 32.1. 运行测试 32.1.1. 在一个临时安装上运行测试 32.1.2. 在一个现有安装上运行测试 32.1.3. 附加测试套件 32.1.4. 区域和编码 32.
1105 0
|
关系型数据库 测试技术 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.5. 测试覆盖检查
32.5. 测试覆盖检查 PostgreSQL 源代码可以使用覆盖测试指令编译,因此可以检查哪些部分的代码被回归测试或任何其他测试套件所覆盖。当前使用 GCC 编译时支持该特性,并且需要gcov和lcov程序。
1263 0
|
测试技术 Perl 关系型数据库
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.4. TAP Tests
32.4. TAP Tests 各种测试,尤其是src/bin下的客户端程序测试, 都使用Perl TAP工具,并使用Perl测试程序prove运行。 你可以通过设置make变量PROVE_FLAGS 向prove传递命令行选项,例如: make -C src/bin check PROVE_FLAGS='--timer' 详见prove的手册页。
1139 0
|
关系型数据库 测试技术 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.3. 变体比较文件
32.3. 变体比较文件 因为某些测试生来就会产生依赖环境的结果,我们提供了方法来指定替代的“预期”结果文件。每一个回归测试可以有多个比较文件来展示在不同平台上的可能结果。有两种独立的机制来决定为每一个测试使用哪个比较文件。
1181 0
|
关系型数据库 测试技术 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.2. 测试评估
32.2. 测试评估 32.2.1. 错误消息差异 32.2.2. 区域差异 32.2.3. 日期和时间差异 32.2.4. 浮点差异 32.2.5. 行序差异 32.2.6. 栈深度不足 32.2.7. “失败”测试 32.2.8. 配置参数 一些正确安装的并且全功能的PostgreSQL安装可能会在这些回归测试中的某些上“失败”,其原因是平台相关的因素,例如可变浮点表示和 message wording。
1259 0
|
SQL 关系型数据库 测试技术
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 32 章 回归测试_32.1. 运行测试
32.1. 运行测试 32.1.1. 在一个临时安装上运行测试 32.1.2. 在一个现有安装上运行测试 32.1.3. 附加测试套件 32.1.4. 区域和编码 32.1.5. 额外测试 32.1.6. 测试热备 回归测试可以在一个已经安装并运行的服务器上运行,或者在编译树中的一个临时安装上运行。
1314 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制
第 31 章 逻辑复制 目录 31.1. 发布 31.2. 订阅 31.2.1. 复制槽管理 31.3. 冲突 31.4. 限制 31.5. 架构 31.5.1. 初始快照 31.6. 监控 31.7. 安全 31.8. 配置设置 31.9. 快速设置 逻辑复制是根据复制标识(通常是主键)复制数据对象及其更改的一种方法。
1409 0
|
关系型数据库 数据库 PostgreSQL
PostgreSQL 10.1 手册_部分 III. 服务器管理_第 31 章 逻辑复制_31.9. 快速设置
31.9. 快速设置 首先设置postgresql.conf中的配置选项: wal_level = logical 其他所需设置的默认值对于基本设置来说足够了。 需要调整pg_hba.conf以允许复制 (这里的值取决于你的实际网络配置和你想要用于连接的用户): host all repuser 0.
1184 0
推荐文章
更多