PostgreSQL 手册

22.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数据库。当拷贝任何其他数据库时,

来自源数据库的编码和区域设置不能被改变,因为可能导致数据损坏。参阅第 21.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不是C或者POSIX时,

PostgreSQL也允许超级用户创建

使用SQL_ASCII编码的数据库。正如

以上所述,SQL_ASCII不强制存储在数据库中的数据

具有任何特定的编码,所以这个选择带来

区域相关的不当行为的风险。使用这样的设置组合是不推荐的,也许有一天会被完全禁止。