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

返回本页常规视图.

为国际数据集实施区域设置

区域设置指定用户的语言、所在国家/地区以及任何特殊的可变首选项(例如排序规则)。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 设置区域设置。

ICU 区域设置支持

Vertica 将 ICU 库用于区域设置支持;您必须使用 ICU 区域设置语法指定区域设置。数据库会话使用的区域设置并非来源于操作系统(通过 LANG 变量),因此 Vertica 建议您为运行 vsql 的每个节点设置 LANG,如下一个部分所述。

虽然 ICU 库可以指定排序规则、货币和日历首选项,但 Vertica 仅支持排序规则组件。与排序规则无关的任何关键字都将被拒绝。无论会话排序规则如何,始终使用 en_US@collation=binary 排序规则对投影进行排序。特定区域设置的排序功能会在查询时应用。

SET DATESTYLE TO ... 命令提供了日历的一些方面,但 Vertica 仅支持将美元作为货币。

为会话更改 DB 区域设置

此示例将会话区域设置设置为“泰语(Thai)”。

  1. 在操作系统级别,针对每个运行 vsql 的节点,按照以下方式将 LANG 变量设置为区域设置语言:

    export LANG=th_TH.UTF-8
    
  2. 针对每个 Vertica 会话(从 ODBC/JDBC 或 vsql 中),设置语言区域设置。

    从 vsql 中:

    \locale th_TH
    
  3. 从 ODBC/JDBC 中:

    "SET LOCALE TO th_TH;"
    
  4. 在 PUTTY(或 ssh 终端)中,按照以下步骤更改设置:

    settings > window > translation > UTF-8
    
  5. 单击应用 (Apply),然后单击保存 (Save)

加载的所有数据必须采用 UTF-8 格式而非 ISO 格式,如分隔数据中所述。与 UTF-8 不兼容的字符集(例如 ISO 8859-1 (Latin1))不受支持,因此 SUBSTRING 等函数对于多字节字符而言无法正常工作。因此,区域设置的设置应无法正常工作。如果转换设置 ISO-8859-11:2001 (Latin/Thai) 正常工作,则表示未正确加载数据。要正确转换数据,请使用一个实用程序,例如 Linux iconv

另请参阅

1 - 为数据库指定默认区域设置

启动数据库之后,默认区域设置配置参数 DefaultSessionLocale 会设置初始区域设置。您可以覆盖各个会话的这个值。

要为数据库设置区域设置,请按照以下方式使用配置参数:

=> ALTER DATABASE DEFAULT SET DefaultSessionLocale = 'ICU-locale-identifier';

例如:

=> ALTER DATABASE DEFAULT SET DefaultSessionLocale = 'en_GB';

2 - 为会话覆盖默认区域设置

您可以通过两种方式覆盖当前会话的默认区域设置:

  • VSQL 命令 \locale。例如:

    => \locale en_GBINFO:
    INFO 2567:  Canonical locale: 'en_GB'
    Standard collation: 'LEN'
    English (United Kingdom)
    
  • SQL 语句 SET LOCALE。例如:

    
    => SET LOCALE TO en_GB;
    INFO 2567:  Canonical locale: 'en_GB'
    Standard collation: 'LEN'
    English (United Kingdom)
    

这两种方法都接受区域设置的形式和形式。例如:

=> SET LOCALE TO LEN;
INFO 2567:  Canonical locale: 'en'
Standard collation: 'LEN'
English

=> \locale LEN
INFO 2567:  Canonical locale: 'en'
Standard collation: 'LEN'
English

另请参阅

3 - 服务器区域设置与客户端区域设置

Vertica 将数据库服务器的区域设置与客户端应用程序的区域设置区分开来:

  • 服务器区域设置仅影响服务器端查询处理的排序行为。

  • 客户端应用程序将验证区域设置是否适当,以正确显示字符。

以下部分描述了最佳实践,以确保可预测的结果。

服务器区域设置

服务器会话的区域设置应按照为数据库指定默认区域设置中所述进行设置。如果不同会话的区域设置不同,请的每个会话开始时,从客户端设置服务器的区域设置。

vsql 客户端

  • 如果数据库没有默认的会话区域设置,请将会话的服务器区域设置设置为所需的区域设置

  • 运行 vsql 客户端的终端仿真器中的区域设置应该设置为等同于服务器端的会话区域设置(ICU 区域设置)。这样就能在服务器上正确排序数据,并在客户端上正确显示数据。

  • vsql 的所有输入数据应该为 UTF-8,而所有输出数据都以 UTF-8 进行编码。

  • Vertica 不支持非 UTF-8 编码和关联的区域设置值;

  • 有关设置区域设置和编码的说明,请参阅终端仿真器文档。

ODBC 客户端

  • ODBC 应用程序可以采用 ANSI 或 Unicode 模式。如果用户应用程序采用 Unicode,ODBC 使用的编码是 UCS-2。如果用户应用程序采用 ANSI,数据必须为单字节 ASCII,这与数据库服务器上使用的 UTF-8 兼容。向 Vertica 服务器传递数据时,ODBC 驱动程序会将 UCS-2 转换为 UTF-8,并会将 Vertica 服务器发来的数据从 UTF-8 转换为 UCS-2。

  • 如果用户应用程序尚未采用 UCS-2,应用程序必须将输入数据转换为 UCS-2,否则会发生异常结果。例如:

    • 对于传递到 ODBC API 的非 UCS-2 数据,当它被解释为 UCS-2 时,它可能会导致无效的 UCS-2 符号传递给 API,从而导致错误。

    • 在备用编码中提供的符号可以是有效的 UCS-2 符号。如果发生这种情况,则会将不正确的数据插入数据库。

  • 如果数据库没有默认会话区域设置,ODBC 应用程序应该使用 SQLSetConnectAttr 来设置所需的服务器会话区域设置(如果它不同于数据库范围设置)。这样可以在服务器上实现预期的排序规则以及字符串函数行为。

JDBC 和 ADO.NET 客户端

  • JDBC 和 ADO.NET 应用程序使用 UTF-16 字符集编码并负责将任何非 UTF-16 编码数据转换为 UTF-16。如果违反此编码,同样的警告也适用于 ODBC。

  • 在传递到 Vertica 服务器并将 Vertica 服务器发送的数据从 UTF-8 转换为 UTF-16 时,JDBC 和 ADO.NET 驱动程序会将 UTF-16 数据转换为 UTF-8。

  • 如果在数据库级别没有默认会话区域设置,JDBC 和 ADO.NET 应用程序应该通过执行 SET LOCALE TO 命令设置正确的服务器会话区域设置,以便在服务器上实现预计的排序规则以及字符串函数行为。有关详细信息,请参阅SET LOCALE