我怎么知道我的PostgreSQL服务器是否使用“C”语言环境?

时间:2009-11-03 07:17:39

标签: postgresql text indexing locale varchar

我正在尝试尽我所能地优化我的PostgreSQL 8.3数据库表,而且我不确定是否需要对我正在执行varchar_pattern_ops的某些列使用LIKE对着字符串的前N个字符。根据{{​​3}},只需要使用xxx_pattern_ops“......当服务器不使用标准的'C'语言环境时”。

有人可以解释这意味着什么吗?如何查看我的数据库使用的语言环境?

5 个答案:

答案 0 :(得分:16)

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

例如:

SHOW LC_COLLATE

_pattern_ops索引在使用模式匹配结构的列中很有用,例如LIKE或regexps。您仍然需要创建一个常规索引(没有_pattern_ops)来对索引执行相等搜索。因此,您必须考虑所有这些因素,看看您的表格中是否需要这样的索引。

关于locale是什么,它是关于字符排序,格式化和类似事物的一系列规则,从语言/国家到另一种语言/国家不等。例如,语言环境fr_CA(加拿大法语)可能有比en_CA(加拿大英语)更多的排序规则(或显示数字等的方式)。标准“C”语言环境是符合POSIX标准的默认语言环境。只有严格的ASCII字符才有效,排序和格式化规则主要是en_US(美国英语)

  

在计算中,locale是一组   定义用户的参数   语言,国家和任何特殊的   用户的变体首选项   想在他们的用户界面中看到。   通常是区域设置标识符   至少一个语言标识符和   区域标识符。

答案 1 :(得分:11)

psql -l <​​/ p>

根据手册

示例输出:

                               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)

答案 2 :(得分: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 :(得分:1)

如果你有选择......

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

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

无论服务器的默认设置或用户的语言环境是什么,都可以执行此操作。

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

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

此外,如果您处于可以考虑创建新群集作为选项的位置,那么您应该考虑使用PostgreSQL 8.4,而per-database locales可以在CREATE DATABASE statement中指定}。

答案 4 :(得分:1)

好的,从我的perusings,看来这个初始设置

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.

基本上为之后创建的所有数据库指定“默认”区域设置(即,它指定template1的设置,这是默认模板)。您可以使用不同的语言环境创建新数据库,如下所示:

区域设置与编码不同,您可以手动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如果您要使用&lt;,&lt; =,&gt;或&gt; =运算符,则需要创建不带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);