处理非 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
有关详细信息,请参阅 file
和 iconv
手册页。
在加载数据之后检查 UTF-8 合规性
加载数据之后,使用 ISUTF8 函数验证表中的所有字符串数据是否为 UTF-8 格式。例如,如果将数据加载到具有名为 name
的 VARCHAR 列的名为 people
的表中,可以使用此语句验证所有字符串是否为 UTF-8 编码:
=> SELECT name FROM people WHERE NOT ISUTF8(name);
如果所有字符串都为 UTF-8 格式,查询不应返回任何行。