PostGreSQL:createdb 和 LC_ALL=C 时出现编码问题

PostGreSQL:createdb 和 LC_ALL=C 时出现编码问题

我有一个运行以下命令来创建数据库的脚本:

createdb --template template0 -E SQL_ASCII foobar

我收到错误:

createdb: database creation failed: ERROR:  encoding SQL_ASCII does not match locale en_US.UTF-8
DETAIL:  The chosen LC_CTYPE setting requires encoding UTF8.

我可以理解为什么语言环境可能是一个问题,所以我决定设置LC_ALL=C但它仍然不起作用:

$ LC_ALL=C createdb --template template0 -E SQL_ASCII gnattracker
createdb: database creation failed: ERROR:  encoding SQL_ASCII does not match locale en_US.UTF-8
DETAIL:  The chosen LC_CTYPE setting requires encoding UTF8.

您知道问题可能出在哪里吗?

我正在使用 Fedora 13

答案1

谢谢 voretaq7,现在我明白这个问题了。

那么,它是什么?

问题是,当使用模板数据库时createdb,v 不会读取环境变量LC_ALL。通过标志,-e我们可以看到它向服务器发出以下命令:

CREATE DATABASE gnattracker ENCODING 'SQL_ASCII' TEMPLATE template0;

在这种特殊情况下,模板中的语言环境信息将用于新数据库。并且编码与这些语言环境设置不兼容。这可能是因为在使用 初始化数据库时LC_ALL未设置为。Cinitdb

简单的解决方案是将区域设置从 更改为template0。所以我尝试了:

ALTER DATABASE template0 SET LC_CTYPE TO 'C';
ALTER DATABASE template0 SET LC_COLLATE TO 'C';

问题是区域设置根本无法更改。运气不好。因此,我决定使用新的区域设置进行克隆,并用其克隆template0替换现有设置:template0

CREATE DATABASE template0b TEMPLATE template0 LC_COLLATE 'C' LC_CTYPE 'C';
DROP   DATABASE template0;
ALTER  DATABASE template0b RENAME TO template0;

新的事情是告诉 PostGreSQL 这template0是一个模板,你不必是数据库的所有者就可以复制它:

UPDATE pg_database SET datistemplate = TRUE WHERE datname = 'template0';

这解决了我的问题(另请参阅此问题)。

答案2

检查其他语言环境变量,和/或查看http://www.postgresql.org/docs/8.4/static/locale.html如何覆盖区域设置。

相关内容