为什么我不能在PostgreSQL数据库中执行“upper()”?

时间:2009-01-18 07:19:31

标签: postgresql postgis

我使用“encoding ='UTF8'”在PostgreSQL中创建了一个数据库,并在其中加载了一些UTF8数据。选择工作正常,但当我尝试在查询中执行“WHERE UPPER(name)='FOO'”时,我收到错误

ERROR:  invalid multibyte character for locale

我的研究似乎表明这是因为PostgreSQL的安装是“initdb” - 与LANG=en_US而不是LANG=en_US.UTF8。执行“SHOW LC_COLLATE”会显示“en_US”。我不想转储和重新创建我的所有数据库,因为其中有几个是PostGIS,重新创建它们是一种巨大的痛苦。是否有一种解决方法,就像对待UTF8的“UPPER”一样?

更新我最终做了转储,reinitdb和数据库的恢复,它比我想象的要痛苦少,除了有点问题找出数据的位置应该去,因为postgres用户没有设置PGDATA环境变量,也没有我能找到的任何配置文件或shell脚本。

2 个答案:

答案 0 :(得分:1)

我认为您想要的解决方法不可行,但启用PostGIS的数据库的转储和恢复应该可以正常工作。我定期使用PostGIS函数转储和恢复数据库,并使用geom对象恢复数据。

你有什么问题?

答案 1 :(得分:1)

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

我建议,如果您无法转储和恢复数据库,则会出现更严重且更紧急的问题,从而使数据更高。恕我直言,你应该首先解决这个问题,然后才能在发布新版本的PostgreSQL之后(或者在硬盘故障之后)实际恢复你的数据。