【问题标题】:PostgreSQL 9.1 installation and database encodingPostgreSQL 9.1 安装和数据库编码
【发布时间】:2012-01-13 18:03:52
【问题描述】:

我刚刚在 Ubuntu 10.04 上首次安装了 PostgreSQL 9.1。

注意:我已经在 Windows 上使用安装程序完成了几次,没有问题。

经过一番努力,我将其设置为通过 pgAdminIII 进行远程连接。但是,在连接到数据库后,我真的很惊讶,我收到了关于编码的警告。 “postgres”数据库本身是使用“SQL_ASCII”编码创建的。每次我在 Windows 上安装时,它都会使用“UTF8”创建 postgres 数据库 - 这似乎会好很多,并且会在通过 pgAdminIII 打开数据库时停止警告消息。

是不是我做错了什么?是否有安装选项/参数可用于设置要使用的默认编码?

还有没有办法解决这个问题?我在网上读过一些东西,说你需要哑并恢复来更改数据库的编码,但我不确定这在 postgres db 上是否可行。是吗?

感谢您的帮助!

【问题讨论】:

    标签: postgresql installation ubuntu-10.04


    【解决方案1】:

    相关选项是--locale=locale 到用于初始化数据库集群的initdb 命令。如果您没有明确提供它,则默认为系统区域设置。 (您可能在语言环境“C”上运行 Ubuntu。)

    阅读more about it in the excellent manual here。

    在 PostgreSQL 中,您可以仍然通过基于 template0 而不是默认的 templeate1 的新数据库来潜入具有不同语言环境的数据库。我引用manual here:

    编码和区域设置必须与模板匹配 数据库,除非使用 template0 作为模板。

    但我宁愿用所需的语言环境重新创建数据库集群。干净多了。


    编辑:关于可用语言环境的信息

    您只能使用操作系统提供的语言环境。我引用manual here:

    您的系统上有哪些可用的语言环境,名称取决于 操作系统供应商提供了什么以及什么是 安装。在大多数 Unix 系统上,命令 locale -a 将提供 可用语言环境列表。 Windows 使用更详细的语言环境名称, 例如 German_Germany 或 Swedish_Sweden.1252,但原则是 一样的。

    如果您想使用尚未生成的语言环境,请查看 Unix 系统中的locale-gen。需要了解的重要一点是,您的操作系统中可以安装多个语言环境,但只能选择其中一个作为系统参数,例如LC_CTYPE、LC_COLLATE 等。查看locale 与locale -a 的输出在外壳中。通常对所有人都是一样的,通过LC_ALL设置。

    @David:您所做的可能已经解决了您的问题,但您本来可以更轻松。另外,请注意环境变量LANG 仅提供所有区域设置的默认值。如果其中任何一个设置为不同的值,LANG 将被覆盖。设置 LC_ALL 以覆盖任何现有设置。这是网络上的one of many sites,告诉您更多相关信息。

    要检查您的数据库(集群)的所有当前区域设置,请在您的数据库中运行:

    SHOW ALL;
    

    或者更具体地说:

    SELECT *
    FROM   pg_settings
    WHERE  name ~~ 'lc%';
    

    【讨论】:

    • 感谢您的回复!让我试试看,我会用 cmets 等发布更新。再次感谢!
    【解决方案2】:

    Erwin Brandstetter 提供的答案很有帮助,但无论出于何种原因,它都对我不起作用。原因是我无法运行 initdb。尝试使用语言环境运行它时,我不断收到“bash:找不到命令”错误。我最终做的是:

    更改操作系统的区域设置。对我来说,这是:

    $ update-locale LANG=en_US.UTF-8
    

    注意:然后我必须重新启动服务器。要确认它是否有效,只需运行:

    $ locale
    

    使用那套,我停下并丢弃了集群:

    $ su postgres
    $ pg_dropcluster --stop 9.1 main
    

    注意:main 是为我创建的默认集群(您的集群名称可能不同)

    $ pg_createcluster --start 9.1 main
    

    再次,我刚刚重新创建了具有相同名称(主)的集群。

    注意:因为我选择了相同的集群名称(主),所以我不得不返回并更新我的 .conf 文件。对我来说,这特别是 postgres.conf 和 pg_hba.conf 重新启用对盒子的远程访问。我不打算在这里包括如何做到这一点,因为网上有很多关于这方面的文档。但是,如果有人想稍后编辑此答案以包含它,那很好! :)

    【讨论】:

    • 请注意,pg_createcluster 还有一个 --locale 开关,它采用 unix 风格的语言环境。
    • 使用您的示例,如果 locale -a 显示 en_US.UTF-8,您可以将其作为 --locale 传递。如果没有,您将不得不使用sudo locale-gen en_US.UTF-8 生成它。之后,您可以通过 --locale=en_US.UTF-8 来创建集群。
    • 下次尝试使用initdb的完整路径,例如:/usr/local/pgsql/bin/initdb -D /usr/local/pgsql/data -E WIN1250
    【解决方案3】:

    通过 initdb 使用编码选项(-E 或 --encoding=)创建数据库对我来说在 Mac Os X Snow Leopard 上起到了作用:

    initdb -D <database_directory> -E UTF8
    

    如果您以这种方式初始化数据库,它还将创建具有正确编码的数据库模板。

    请参阅 initdb 文档 here 和编码文档 here 以选择正确的编码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 2019-12-27
      • 2010-11-25
      • 2023-03-26
      • 2012-03-10
      • 1970-01-01
      相关资源
      最近更新 更多