![PostGreSQL:createdb 和 LC_ALL=C 时出现编码问题](https://linux22.com/image/518697/PostGreSQL%EF%BC%9Acreatedb%20%E5%92%8C%20LC_ALL%3DC%20%E6%97%B6%E5%87%BA%E7%8E%B0%E7%BC%96%E7%A0%81%E9%97%AE%E9%A2%98.png)
我有一个运行以下命令来创建数据库的脚本:
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
未设置为。C
initdb
简单的解决方案是将区域设置从 更改为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如何覆盖区域设置。