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

Mat*_*ins 19 postgresql indexing varchar text locale

我正在尝试尽我所能地优化我的PostgreSQL 8.3数据库表,我不确定是否需要使用varchar_pattern_ops某些列,我正在执行LIKE一个字符串的前N个字符.根据此文档,xxx_pattern_ops只有在"...服务器不使用标准'C'语言环境时"才需要使用.

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

Vin*_*vic 19

目前一些locale [ docs ]支持只能在initdb时设置,但我认为相关的一个_pattern_ops可以在运行时通过SET修改,LC_COLLATE.要查看设置值,可以使用SHOW命令.

例如:

SHOW LC_COLLATE
Run Code Online (Sandbox Code Playgroud)

_pattern_ops索引在使用模式匹配结构的列中很有用,例如LIKE或正则表达式.您仍然必须使用常规索引(不_pattern_ops)对索引执行相等搜索.所以你必须考虑所有这些,看看你的表是否需要这样的索引.

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

在计算中,locale是一组参数,用于定义用户的语言,国家和用户希望在其用户界面中看到的任何特殊变体首选项.通常,区域设置标识符至少包括语言标识符和区域标识符.


小智 15

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)
Run Code Online (Sandbox Code Playgroud)

  • 如果已经打开了psql会话,也要使用\ l。 (2认同)

rog*_*ack 6

好的,从我的阅读来看,这个初始设置似乎

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.
Run Code Online (Sandbox Code Playgroud)

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

区域设置与编码不同,您可以手动指定它和/或编码:

 CREATE DATABASE korean WITH ENCODING 'EUC_KR' LC_COLLATE='ko_KR.euckr' LC_CTYPE='ko_KR.euckr' TEMPLATE=template0;
Run Code Online (Sandbox Code Playgroud)

如果你想手动调用它。

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

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

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

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default");
Run Code Online (Sandbox Code Playgroud)

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

CREATE INDEX my_index_name
  ON table_name
  USING btree
  (identifier COLLATE pg_catalog."default" varchar_pattern_ops);
Run Code Online (Sandbox Code Playgroud)