我对 Unicode 转换问题不是很了解,但我以前自己做过,我会展示我认为正在发生的事情。
我相信您在这里看到的不是使用 nzload 加载特殊字符的问题,而是您的显示/终端软件如何显示数据和/或 Netezza 如何存储字符数据的问题。我怀疑与 UTF-8(Netezza 支持的 Unicode 编码)之间的双重转换。让我们看看我们能不能猜出它是什么。
这里我使用的是 PuTTY,默认(对我而言)远程字符集为 Latin-1。
$ od -xa input.txt
0000000 5250 464f 5345 4953 4e4f 4c41 bfc2 000a
P R O F E S S I O N A L B ? nl
0000017
$ cat input.txt
PROFESSIONAL¿
这里我们可以从 od 看到该文件只有我们期望的数据,但是当我们 cat 文件时,我们会看到额外的字符。如果它不在文件中,则该字符可能来自显示翻译。
如果我将 PuTTY 设置更改为 UTF-8 作为远程字符集,我们会这样看:
$ od -xa input.txt
0000000 5250 464f 5345 4953 4e4f 4c41 bfc2 000a
P R O F E S S I O N A L B ? nl
0000017
$ cat input.txt
PROFESSIONAL¿
因此,相同的源数据,但屏幕上的两种不同表示形式,并非巧合的是,它们与您的两个不同输出相同。相同的数据至少可以有两种显示方式。
现在让我们看看它是如何加载到 Netezza 中的,一次加载到 VARCHAR 列,然后再加载到 NVARCHAR 列。
create table test_enc_vchar (col1 varchar(50));
create table test_enc_nvchar (col1 nvarchar(50));
$ nzload -db testdb -df input.txt -t test_enc_vchar -escapechar '\' -ctrlchars
Load session of table 'TEST_ENC_VCHAR' completed successfully
$ nzload -db testdb -df input.txt -t test_enc_nvchar -escapechar '\' -ctrlchars
Load session of table 'TEST_ENC_NVCHAR' completed successfully
加载的数据没有错误。请注意,虽然我为 nzload 指定了 escapechar 选项,但此特定输入数据示例中的所有字符都不需要转义,也不需要转义。
我现在将使用 SQL 扩展工具包中的 rawtohex 函数作为数据库内工具,就像我们在命令行中使用 od 一样。
select rawtohex(col1) from test_enc_vchar;
RAWTOHEX
------------------------------
50524F46455353494F4E414CC2BF
(1 row)
select rawtohex(col1) from test_enc_nvchar;
RAWTOHEX
------------------------------
50524F46455353494F4E414CC2BF
(1 row)
此时,两列的数据似乎与输入文件完全相同。到目前为止,一切顺利。
如果我们选择列怎么办?作为记录,我在 PuTTY 会话中使用 UTF-8 远程字符集执行此操作。
select col1 from test_enc_vchar;
COL1
----------------
PROFESSIONAL¿
(1 row)
select col1 from test_enc_nvchar;
COL1
---------------
PROFESSIONAL¿
(1 row)
相同的二进制数据,但显示不同。如果我然后将每个选择的输出复制到 echo 管道到 od,
$ echo PROFESSIONAL¿ | od -xa
0000000 5250 464f 5345 4953 4e4f 4c41 82c3 bfc2
P R O F E S S I O N A L C stx B ?
0000020 000a
nl
0000021
$ echo PROFESSIONAL¿ | od -xa
0000000 5250 464f 5345 4953 4e4f 4c41 bfc2 000a
P R O F E S S I O N A L B ? nl
0000017
根据此输出,我敢打赌您正在将样本数据(我还敢打赌是 UTF-8)加载到 VARCHAR 列而不是 NVARCHAR 列中。这本身不是问题,但可能会出现显示/转换问题。
一般来说,您希望将 UTF-8 数据加载到 NVARCHAR 列中。