处理非 UTF-8 输入

Vertica 支持加载 Unicode UTF-8 格式的数据文件。可以加载与 UTF-8 兼容的 ASCII 数据。字符集(如 ISO 8859-1 (Latin1))与 UTF-8 不兼容,因此不直接受支持。

如果您的数据不符合 UTF-8 标准,则可以在加载期间修改数据,也可以在加载前转换数据文件。

检查数据格式

在从文本文件加载数据之前,可以使用多个 Linux 工具确保数据为 UTF-8 格式。file 命令可报告任何文本文件的编码。例如:

$ file Date_Dimension.tbl
Date_Dimension.tbl: ASCII text

file 命令可指示 ASCII 文本,即使文件包含多字节字符也是如此。

若要检查 ASCII 文件中的多字节字符,请使用 wc 命令。例如:

$ wc Date_Dimension.tbl
  1828   5484 221822 Date_Dimension.tbl

如果 wc 命令返回错误(例如 Invalid or incomplete multibyte or wide character),说明数据文件正在使用不兼容的字符集。

此示例显示了两个不是 UTF-8 数据文件的文件:

$ file data*
data1.txt: Little-endian UTF-16 Unicode text
data2.txt: ISO-8859 text

结果指示没有一个文件为 UTF-8 格式。

加载时转换数据

您可以在加载期间移除或替换文本数据中的非 UTF-8 字符。默认情况下,MAKEUTF8 函数会移除此类字符,或者您可以指定替换字符串。

以下示例显示了如何在加载期间使用该函数:将原始数据加载到 orig_name 列,然后将转换后的数据加载到 name 列。通常,您会为原始值使用 FILLER 列,而不是将该列添加到表定义中;此示例会添加该列以并排显示差异。

=> CREATE TABLE people (orig_name VARCHAR, name VARCHAR);
CREATE TABLE

=> COPY people (orig_name, name AS MAKEUTF8(orig_name)) FROM ...;
 Rows Loaded
-------------
           8
(1 row)

=> SELECT * FROM people;
orig_name |  name
----------+--------
  Dáithí    | Dith
  Fíona     | Fona
  Móirín     | Mirn
  Róisín     | Risn
  Séamus    | Samus
  Séan      | San
  Tiarnán  | Tiarnn
  Áine     | ine
(8 rows)

有关转换数据的常规信息,请参阅在加载期间转换数据

在加载数据之前转换文件

要在将文件加载到 Vertica 之前转换文件,请使用 iconv UNIX 命令。例如,若要转换以上示例中的 data2.txt 文件,请使用 iconv 命令,如下所示:

$ iconv -f ISO88599 -t utf-8 data2.txt > data2-utf8.txt

有关详细信息,请参阅 fileiconv 手册页。

在加载数据之后检查 UTF-8 合规性

加载数据之后,使用 ISUTF8 函数验证表中的所有字符串数据是否为 UTF-8 格式。例如,如果将数据加载到具有名为 name 的 VARCHAR 列的名为 people 的表中,可以使用此语句验证所有字符串是否为 UTF-8 编码:

=> SELECT name FROM people WHERE NOT ISUTF8(name);

如果所有字符串都为 UTF-8 格式,查询不应返回任何行。