【问题标题】:Why can't I do a "upper()" in my PostgreSQL database?为什么我不能在我的 PostgreSQL 数据库中执行“upper()”?
【发布时间】:2010-10-02 01:42:10
【问题描述】:

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

ERROR:  invalid multibyte character for locale

我的研究似乎表明这是因为 PostgreSQL 安装是“initdb”-ed 与 LANG=en_US 而不是 LANG=en_US.UTF8。执行“SHOW LC_COLLATE”会显示“en_US”。我不想转储和重新创建我所有的数据库,因为其中有几个是 PostGIS,重新创建这些数据库非常痛苦。是否有一种解决方法,例如一种对 UTF8 有效的相当于“UPPER”的方法?

更新我最终完成了数据库的转储、reinitdb 和还原,它没有我想象的那么痛苦,只是在确定数据的位置时遇到了一点问题应该去,因为 postgres 用户没有设置 PGDATA 环境变量,也没有我能找到的任何配置文件或 shell 脚本。

【问题讨论】:

    标签: postgresql postgis


    【解决方案1】:

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

    我建议,如果你不能转储和恢复你的数据库,你有一个比大写数据更严重和更紧迫的问题。恕我直言,您应该先解决这个问题,然后才能在发布新版本的 PostgreSQL 之后(或在硬盘故障之后)实际恢复数据。

    【讨论】:

      【解决方案2】:

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

      你有什么问题?

      【讨论】:

      • 我遇到的问题是,当我执行 pg_dumpall,然后恢复时,它开始抱怨重复的函数定义等。
      • 只是给未来读者的一个提示,这可能是由于转储模式并在现有模式之上重新加载它,而您真正需要的只是数据转储/恢复(使用 pg_dump,而不是 pg_dumpall)。无论如何,正如您所指出的,真正的转储/initdb/restore 是要走的路。
      猜你喜欢
      • 1970-01-01
      • 2019-06-07
      • 2010-10-08
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多