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

我有一个脚本运行以下命令来创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'; 

这解决了我的问题( 也见这个问题 )。