为什么可以';我不能做一件事吗;上();在我的PostgreSQL数据库中?

为什么可以';我不能做一件事吗;上();在我的PostgreSQL数据库中?,postgresql,postgis,Postgresql,Postgis,我在PostgreSQL中创建了一个带有“encoding='UTF8'”的数据库,并在其中加载了一些UTF8数据。选择可以很好地工作,但是当我尝试在查询中执行“WHERE UPPER(name)='FOO'”时,我会得到一个错误 ERROR: invalid multibyte character for locale 我的研究似乎表明,这是因为PostgreSQL安装是用LANG=en_US而不是LANG=en_US.UTF8初始化的。执行“SHOW LC\u COLLATE”显示“en

我在PostgreSQL中创建了一个带有“encoding='UTF8'”的数据库,并在其中加载了一些UTF8数据。选择可以很好地工作,但是当我尝试在查询中执行“WHERE UPPER(name)='FOO'”时,我会得到一个错误

ERROR:  invalid multibyte character for locale
我的研究似乎表明,这是因为PostgreSQL安装是用
LANG=en_US
而不是
LANG=en_US.UTF8
初始化的。执行“
SHOW LC\u COLLATE
”显示“
en\u US
”。我不想把我所有的数据库都转储并重新创建,因为其中有几个是PostGIS,而重新创建这些数据库是非常痛苦的。是否有一种变通方法,比如一种类似于UTF8的“UPPER”的方法


更新我最终完成了数据库的转储、reinitdb和恢复,这比我想象的要轻松得多,只是有一点问题,因为postgres用户没有设置PGDATA环境变量,无法确定数据应该放在哪里,我也找不到任何配置文件或shell脚本。

我认为您想要的解决方案不可行,但是转储和恢复支持PostGIS的数据库应该可以正常工作。我定期使用PostGIS功能转储和恢复数据库,使用geom对象转储和恢复数据


您有什么问题?

您的诊断是正确的,这是PostgreSQL中Unicode的常见问题。安装过程试图智能化,并使用运行它的shell的区域设置初始化:-(


我建议,如果您无法转储和恢复数据库,那么您会遇到一个更严重、更紧急的问题,即数据的大写。IMHO,您应该首先解决这个问题,然后在发布新版本的PostgreSQL后(或硬盘故障后)才必须实际恢复数据.

我的问题是,当我执行pg_dumpall,然后进行恢复时,它开始抱怨重复的函数定义等。请注意,这可能是由于转储架构并将其重新加载到现有架构之上,而您真正需要的是数据转储/恢复(使用pg_dumpall,而不是pg_dumpall).在任何情况下,正如您所指出的,转储/initdb/restore确实是一种方法。