【问题标题】:How do I know if my PostgreSQL server is using the "C" locale?我如何知道我的 PostgreSQL 服务器是否使用“C”语言环境?
【发布时间】:2010-12-12 13:13:30
【问题描述】:

我正在尽我所能优化我的 PostgreSQL 8.3 DB 表,但我不确定是否需要对某些列使用 varchar_pattern_ops,而我正在针对前 N 执行 LIKE字符串的字符。根据this documentationxxx_pattern_ops 的使用仅在“...当服务器不使用标准的'C'语言环境时”是必要的。

有人能解释一下这是什么意思吗?如何检查我的数据库使用的语言环境?

【问题讨论】:

    标签: postgresql text indexing locale varchar


    【解决方案1】:

    好的,根据我的阅读,这个初始设置似乎是这样的

    initdb --locale=xxx

     --locale=locale
           Specifies the locale to be used in this database. This is equivalent to specifying both --lc-collate and --lc-ctype.
    

    基本上为您之后创建的所有数据库指定“默认”语言环境(即,它指定模板 1 的设置,它是默认模板)。您可以像这样创建具有不同语言环境的新数据库:

    语言环境不同于编码,你可以手动specify它和/或编码:

     CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
    

    如果你想手动调出来。

    基本上如果你不指定它,它使用系统默认值,几乎从不“C”。

    因此,如果您的show LC_COLLATE 返回“C”或“POSIX”以外的任何内容,那么您没有使用standard C locale,您需要为索引指定 xxx_pattern_ops。另请注意caveat,如果您想使用 或 >= 运算符,您需要创建没有 xxx_pattern_ops 标志的第二个索引(除非您在数据库上使用标准 C 语言环境,即稀有的...)。对于 == 和 LIKE (等),您不需要第二个索引。如果您不需要LIKE,那么您可能也不需要带有 xxx_pattern_ops 的索引。

    即使您的索引被定义为与“默认”类似

    CREATE INDEX my_index_name
      ON table_name
      USING btree
      (identifier COLLATE pg_catalog."default");
    

    这还不够,除非默认是“C”(或 POSIX,同样的东西)排序规则,它不能用于像 LIKE 'ABC%' 这样的模式。你需要这样的东西:

    CREATE INDEX my_index_name
      ON table_name
      USING btree
      (identifier COLLATE pg_catalog."default" varchar_pattern_ops);
    

    【讨论】:

      【解决方案2】:

      还有另一种方式(假设你想检查它们,而不是修改它们):

      检查文件 /var/lib/postgres/data/postgresql.conf 应该找到以下几行:

      # These settings are initialized by initdb, but they can be changed.
      lc_messages = 'en_US.UTF-8'                     # locale for system error message strings
      lc_monetary = 'en_US.UTF-8'                     # locale for monetary formatting
      lc_numeric = 'en_US.UTF-8'                      # locale for number formatting
      lc_time = 'en_US.UTF-8'                         # locale for time formatting
      

      【讨论】:

      • 我的数据库是使用正确的排序规则创建的,但总是回退到默认值。改变这个,解决了我的问题。
      【解决方案3】:

      如果你有选择...

      您可以使用 C 语言环境重新创建数据库集群。

      initializing 您的 Postgres 实例时,您需要将语言环境传递给 initdb

      无论服务器的默认设置或用户的区域设置如何,您都可以执行此操作。

      不过,这是一个服务器管理命令,而不是数据库架构设计人员的任务。集群包含服务器上的所有数据库,而不仅仅是您正在优化的数据库。

      它会创建一个全新的集群,并且不会迁移您现有的任何数据库或数据。那将是额外的工作。

      此外,如果您处于可以考虑创建新集群的位置,那么您确实应该考虑使用 PostgreSQL 8.4,它可以在 CREATE DATABASE statement 中指定 per-database locales

      【讨论】:

        【解决方案4】:

        psql -l

        根据手册

        示例输出:

                                       List of databases
            Name     | Owner  | Encoding |   Collate   |    Ctype    | Access privileges
        -------------+--------+----------+-------------+-------------+-------------------
         packrd      | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
         postgres    | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
         template0   | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/packrd        +
                     |        |          |             |             | packrd=CTc/packrd
         template1   | packrd | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/packrd        +
                     |        |          |             |             | packrd=CTc/packrd
        (5 rows)
        

        【讨论】:

          【解决方案5】:

          目前某些区域设置 [docs] 支持只能在 initdb 时间设置,但我认为与_pattern_ops 相关的支持可以在运行时通过SET LC_COLLATE 进行修改。要查看设置值,您可以使用SHOW 命令。

          例如:

          SHOW LC_COLLATE
          

          _pattern_ops 索引在使用模式匹配结构的列中很有用,例如LIKE 或正则表达式。您仍然必须创建一个常规索引(没有_pattern_ops)才能对索引进行相等搜索。因此,您必须将所有这些都考虑在内,看看您的表是否需要此类索引。

          关于locale 是什么,它是一组关于字符排序、格式和类似事物的规则,这些规则因语言/国家/地区而异。例如,区域设置 fr_CA(加拿大的法语)可能与 en_CA(加拿大的英语)有一些不同的排序规则(或显示数字的方式等)。标准“C”语言环境是符合 POSIX 标准的默认语言环境。只有严格的 ASCII 字符才有效,排序和格式的规则大多是 en_US(美国英语)

          在计算中,语言环境是一组 定义用户的参数 语言、国家和任何特殊的 用户的不同偏好 想在他们的用户界面中看到。 通常一个语言环境标识符包括 至少有一个语言标识符和 区域标识符。

          【讨论】:

          猜你喜欢
          • 2012-06-22
          • 1970-01-01
          • 1970-01-01
          • 2021-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-04-30
          • 2014-03-13
          相关资源
          最近更新 更多