这是本节的多页打印视图。 点击此处打印.

返回本页常规视图.

关于区域设置

区域设置指定用户的语言、所在国家/地区以及任何特殊的可变首选项(例如排序规则)。Vertica 会根据区域设置确定某些字符串函数的行为。此外,区域设置还确定了需要进行排序和比较的各种 SQL 命令(例如聚合 GROUP BYORDER BY 子句、联接和分析 ORDER BY 子句)的排序规则。

Vertica 数据库的默认区域设置为 en_US@collation=binary(美国英语)。可以定义供数据库中的所有会话使用的新默认区域设置,也可以覆盖单个会话的区域设置。但是,无论会话排序规则如何,请始终采用默认 en_US@collation=binary 排序规则来对投影进行排序。特定区域设置的排序功能会在查询时应用。

如果您将区域设置设为 NULL,则 Vertica 会将区域设置设为 en_US_POSIX。您可以通过发出 vsql 元命令 \locale 将区域设置设回默认区域设置和排序规则。例如:

可以通过 ODBCJDBCADO.net 设置区域设置。

Vertica 区域设置规范遵循 ICU 库所实施的 Unicode LDML 标准的一部分。

1 - Vertica 中的区域设置处理

以下部分介绍 Vertica 如何处理区域设置。

会话区域设置

区域设置为会话范围的设置,仅适用于在该会话中执行的查询。您无法为单个查询指定区域设置。当您启动会话时,它将从配置参数 DefaultSessionLocale 中获取区域设置。

查询限制

使用默认值 en_US@collation=binary 以外的区域设置运行查询时,以下限制适用:

  • 当左侧 NOT IN 一列或多列为 CHARVARCHAR 时,多列 NOT IN 不支持子查询。例如:

    => CREATE TABLE test (x VARCHAR(10), y INT);
    => SELECT ... FROM test WHERE (x,y) NOT IN (SELECT ...);
       ERROR: Multi-expression NOT IN subquery is not supported because a left
       hand expression could be NULL
    
  • 如果外查询含有对 CHARVARCHAR 列执行 GROUP BY 的操作,则不支持关联的 HAVING 子句子查询。在以下示例中,外查询中的 GROUP BY x 会导致以下错误:

    => DROP TABLE test CASCADE;
    => CREATE TABLE test (x VARCHAR(10));
    => SELECT COUNT(*) FROM test t GROUP BY x HAVING x
         IN (SELECT x FROM test WHERE t.x||'a' = test.x||'a' );
       ERROR: subquery uses ungrouped column "t.x" from outer query
    
  • 使用分析函数的子查询不支持在 HAVING 子句中使用。例如:

    => DROP TABLE test CASCADE;
    => CREATE TABLE test (x VARCHAR(10));
    => SELECT MAX(x)OVER(PARTITION BY 1 ORDER BY 1) FROM test
         GROUP BY x HAVING x IN (SELECT MAX(x) FROM test);
       ERROR: Analytics query with having clause expression that involves
       aggregates and subquery is not supported
    

排序规则和投影

投影数据按照默认的 en_US@collation=binary 排序规则进行排序。因此,不论会话设置如何,发布以下命令都会根据二进制排序规则生成按 col1 排序的投影:

=> CREATE PROJECTION p1 AS SELECT * FROM table1 ORDER BY col1;

在此情况下,straßestrasse 在磁盘上的存储位置不相邻。

按二进制排序规则排序也意味着排序优化在除二进制以外的区域设置中不起作用。如果在非二进制区域设置中创建表或投影,Vertica 会返回以下警告:

WARNING:  Projections are always created and persisted in the default
Vertica locale. The current locale is de_DE

非二进制区域设置输入处理

当区域设置是非二进制时,Vertica 可使用 COLLATION 函数将输入转换为按正常顺序排序的二进制字符串。

根据以下公式,此转换增加了输入所需的字节数:

result_column_width = input_octet_width * CollationExpansion + 4

CollationExpansion 配置参数的默认值为 5。

字符数据类型处理

  • CHAR 字段会按固定长度显示,包括任何尾随空格。在内部处理 CHAR 字段时,首先会去除掉尾随空格。对于 VARCHAR 字段,尾随空格会被视为有意义的字符加以处理;但是,对使用非二进制区域设置的任一类型字符串字段进行排序或比较时,尾随空格会被忽略。

  • VARCHARCHAR 数据类型的最大长度参数是指可以存储在该字段中的八位字节(字节)数,而非字符数。使用多字节 UTF-8 字符时,字段的大小必须可容纳每个字符 1 到 4 个字节,具体取决于数据。

2 - 指定区域设置:长格式

Vertica 支持指定 collation 关键字的长格式。Vertica 将长格式处理扩展到可以接受排序规则实参。

语法

[language][_script][_country][_variant][@collation‑spec]

参数

language
代表特定语言的小写两字母或三字母代码。例如,西班牙语为 es,英语为 en,法语为 fr。两字母语言代码使用 ISO-639 标准。
_script
可选的四字母脚本代码,跟在语言代码之后。如果指定此项,则此代码应为 Unicode ISO 15924 注册表中列出的有效脚本代码。
_country
通用语言内针对特定国家/地区或区域的特定语言约定。例如,许多国家/地区都说法语,但每个国家/地区的货币是不同的。若要允许特定的地理、政治或文化区域存在这些差异,可通过大写的两字母代码指定区域设置。例如,FR 代表法国,CA 代表加拿大。两字母国家/地区代码使用 ISO-3166 标准。
_variant
同一个国家/地区内使用的语言约定也可能有所不同。例如,有多个欧洲国家/地区使用欧元作为货币,但各个国家/地区的货币仍在流通。若要处理某个语言和国家/地区对内的变化,请添加第三个代码 — 变体代码。变体代码可以是任意代码,完全特定于应用程序。对于那些支持欧元货币的区域设置,ICU 会向其区域设置目标中添加 _EURO。变体可以具有任意数量的带下划线的关键字。例如,EURO_WIN 是 Windows 计算机上欧元货币的变体。

变体代码的另一个用途是指定区域设置的排序规则(排序顺序)。例如,es__TRADITIONAL 区域设置使用传统的排序顺序,该排序顺序与西班牙的默认现代排序不同。

@collation‑spec
Vertica 仅按如下所示支持关键字 collation
@collation=collation‑type[;arg]...

排序规则可以指定一个或多个以分号分隔的实参,如下所述。

排序规则类型 设置为以下值之一:

  • big5han:拉丁文按拼音排序,CJK 字符(在中文中使用)按 big5 字符集排序。

  • dict:字典样式的排序(例如,在僧伽罗语中)。

  • direct:印地语变体。

  • gb2312/gb2312han:拉丁文按拼音排序,CJK 字符(在中文中使用)按 gb2312han 字符集排序。

  • phonebook:电话簿样式的排序(例如,在德语中)。

  • pinyin:拉丁文和 CJK 字符按拼音排序;即,将 CJK 字符逐个字符音译为拼音(在中文中使用)后进行顺序。

  • reformed:改良后的排序规则(例如,在瑞典语中)。

  • standard:每种语言的默认排序。对于 root,其为 [UCA] 顺序;对于每个其他区域设置,其与 UCA(Unicode 排序规则算法)排序相同,只是会对相应语言的某些字符进行适当的修改。下面是某些区域设置的其他选项;它们仅在某些区域设置中有效。

  • stroke:拉丁文按拼音排序,不支持 CJK 字符(在中文中使用)的笔划顺序。

  • traditional:传统样式的排序(例如,在西班牙语中)。

  • unihan:拉丁文按拼音排序,不支持 CJK 字符(在中文中使用)的 Unihan 部首笔划排序。

  • binary:Vertica 默认,提供 UTF-8 八位字节排序。

注意:

  • 排序规则可能默认为 root(ICU 默认排序规则)。

  • 排序规则关键字及其同义词的值无效不会导致错误。例如,以下代码不会生成错误,只是会忽略无效值:

    => \locale en_GB@collation=xyz
    INFO 2567:  Canonical locale: 'en_GB@collation=xyz'
    Standard collation: 'LEN'
    English (United Kingdom, collation=xyz)
    

有关排序选项的详细信息,请参阅 Unicode 区域设置数据标记语言 (LDML)

排序规则实参

collation 可以指定以下一个或多个实参:

区域设置处理说明

  • 如果前缀可被解析为已知的区域设置版本,则会接受错误的区域设置字符串。

    例如,以下代码有效,因为可对语言进行解析:

    => \locale en_XX
    INFO 2567:  Canonical locale: 'en_XX'
    Standard collation: 'LEN'
    English (XX)
    

    以下代码无效,因为无法对语言进行解析:

    => \locale xx_XX
    xx_XX: invalid locale identifier
    
  • en_US.UTF-8 之类的 POSIX 类型区域设置在忽略编码部分“UTF-8”时有效。

  • Vertica 使用 icu4c-4_2_1 库及某些扩展来支持基本的区域设置/排序规则处理。这不满足 当前的区域设置处理标准:(https://tools.ietf.org/html/rfc5646)。

示例

使用 phonebook 样式的排序规则指定德国使用的德国区域设置 (de):

=> \locale de_DE@collation=phonebook
INFO 2567:  Canonical locale: 'de_DE@collation=phonebook'
Standard collation: 'KPHONEBOOK_LDE'
German (Germany, collation=Phonebook Sort Order)
Deutsch (Deutschland, Sortierung=Telefonbuch-Sortierregeln)

指定德国使用的德国区域设置 (de),其中 phonebook 样式的排序规则和强度设置为“次要 (secondary)”:

=> \locale de_DE@collation=phonebook;colStrength=secondary
INFO 2567:  Canonical locale: 'de_DE@collation=phonebook'
Standard collation: 'KPHONEBOOK_LDE_S2'
German (Germany, collation=Phonebook Sort Order)
Deutsch (Deutschland, Sortierung=Telefonbuch-Sortierregeln)

3 - 指定区域设置:缩写形式

Vertica 接受缩写形式的区域设置。可以使用缩写指定区域设置和键名对/值名称。

若要确定区域设置的缩写,请输入全称,然后查看 INFO 的最后一行,如下所示:

\locale frINFO:  Locale: 'fr'
INFO:    French
INFO:    français
INFO:  Short form: 'LFR'

示例

指定 en(英语)区域设置:

\locale LENINFO:  Locale: 'en'
INFO:  English
INFO:  Short form: 'LEN'

使用 phonebook 样式的排序规则指定德国使用的德国区域设置 (de):

\locale LDE_KPHONEBOOKINFO:  Locale: 'de@collation=phonebook'
INFO:  German (collation=Phonebook Sort Order)
INFO:  Deutsch (Sortierung=Telefonbuch-Sortierregeln)
INFO:  Short form: 'KPHONEBOOK_LDE'

使用 phonebook 样式的排序规则指定德国使用的德国区域设置 (de):

\locale LDE_KPHONEBOOK_S2INFO:  Locale: 'de@collation=phonebook'
INFO:  German (collation=Phonebook Sort Order)
INFO:  Deutsch (Sortierung=Telefonbuch-Sortierregeln)
INFO:  Short form: 'KPHONEBOOK_LDE_S2'

4 - 支持的区域设置

以下是 Vertica 支持的区域设置字符串。每个区域设置都可以具有可选的键/值对列表(请参阅指定区域设置:长格式)。

5 - 区域设置和 UTF-8 支持

Vertica 支持 Unicode 转换格式 8 或 UTF8,其中 8 表示 8 位。UTF-8 是由 Ken Thompson 和 Rob Pike 创建的 Unicode 可变长度字符编码。UTF-8 可以表示 Unicode 标准中的任何通用字符。UTF-8 的字节代码和字符分配的初始编码与 ASCII 一致。因此,对于处理 ASCII 但保留其他值的软件,UTF8 仅需略加更改,或者无需更改。

Vertica 数据库服务器要求以 UTF-8 格式接收所有数据,且 Vertica 以 UTF-8 格式输出所有数据。ODBC API 对 Windows 系统上采用 UCS-2 形式的数据进行操作,通常 UTF-8 位于 Linux 系统上。JDBC 和 ADO.NET API 对采用 UTF-16 形式的数据进行操作。在使用 API 调用向 Vertica 发送数据并接收数据时,客户端驱动程序会自动在数据和 UTF-8 之间进行转换。驱动程序不会转换通过执行 COPYCOPY LOCAL 语句加载的数据。

UTF-8 字符串函数

以下字符串函数会将 VARCHAR 实参视为 UTF-8 字符串(未指定 USING OCTETS 时),而不管区域设置如何。

6 - 对区域设置敏感的字符串函数

Vertica 提供了支持国际化的字符串函数。除非另有说明,否则这些字符串函数可指定应将 VARCHAR 实参解释为八进制(字节)序列还是(对区域设置敏感的)字符序列。通过向函数添加参数 USING OCTETSUSING CHARACTERS(默认)指定此信息。

下表列出了所有对区域设置敏感的字符串函数: