我有一个脚本运行以下命令来创build一个数据库:
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
感谢voretaq7,现在我明白了这个问题。
那么,这是什么?
问题是createdb在使用模板数据库时没有读取环境variablesLC_ALL 。 用-e标志我们可以向服务器发出以下命令:
CREATE DATABASE gnattracker ENCODING 'SQL_ASCII' TEMPLATE template0;
在这种特殊情况下,来自模板的语言环境信息被用于新的数据库。 编码与这些区域设置不兼容。 这可能是因为当initdb初始化数据库时, LC_ALL未被设置为C
简单的解决scheme是从template0更改区域设置。 所以我试了一下:
ALTER DATABASE template0 SET LC_CTYPE TO 'C'; ALTER DATABASE template0 SET LC_COLLATE TO 'C';
问题是区域设置不能改变。 厄运。 所以,我决定用新的语言环境设置来克隆template0 ,并用它的克隆replace现有的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';
这解决了我的问题( 也见这个问题 )。
检查您的其他语言环境variables,和/或请参阅http://www.postgresql.org/docs/8.4/static/locale.html以了解如何覆盖语言环境设置。