使用nzload加载特殊字符

Using nzload to load special characters

我在 Oracle table 数据中扩展了 ascii 字符,我可以使用带有 \ 转义字符前缀的 sqlplus 将其提取到文件中。我想使用 nzload 将完全相同的数据加载到 netezza table.

nzload 在遇到这个 char seq (c2bf) 时添加了几个额外的字节 在提取的文件数据中:

echo "PROFESSIONAL¿" | od -x
0000000  5052 4f46 4553 5349 4f4e 414c **c2bf** 0a00

nzload 之后:

echo "PROFESSIONAL¿" | od -x
0000000  5052 4f46 4553 5349 4f4e 414c **c382 c2bf**

在 nzload 命令行上,我有以下选项: -escapechar \ -ctrlchars

任何人都可以提供任何帮助吗?

我不是很了解 Unicode 转换问题,但我以前对自己做过,我将演示我认为正在发生的事情。

我相信您在这里看到的不是使用 nzload 加载特殊字符的问题,而是您的 display/terminal 软件如何显示数据的问题 and/or Netezza 如何存储字符数据。我怀疑是双重转换 to/from 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¿

所以,相同的源数据,但两个不同的 on-screen 表示,这并非巧合,与您的两个不同输出相同。同样的数据至少可以有两种显示方式

现在让我们看看它如何加载到 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 选项,但此特定输入数据样本中的 none 字符需要转义,也没有转义。

我现在将使用 SQL 扩展工具包中的 rawtohex 函数作为 in-database 工具,就像我们在命令行中使用 od 一样。

select rawtohex(col1) from test_enc_vchar;
           RAWTOHEX
------------------------------
 50524F46455353494F4E414CC2BF
(1 row)

select rawtohex(col1) from test_enc_nvchar;
           RAWTOHEX
------------------------------
 50524F46455353494F4E414CC2BF
(1 row)

此时两列的数据似乎与输入文件完全相同。到目前为止,还不错。

如果我们 select 列怎么办?作为记录,我在远程字符集为 UTF-8 的 PuTTY 会话中执行此操作。

select col1 from test_enc_vchar;
      COL1
----------------
 PROFESSIONAL¿
(1 row)

select col1 from test_enc_nvchar;
     COL1
---------------
 PROFESSIONAL¿
(1 row)

相同的二进制数据,但显示不同。如果我然后将每个 select 的输出复制到 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

根据此输出,我敢打赌您正在将示例数据加载到 VARCHAR 列而不是 NVARCHAR 列中,我也敢打赌它是 UTF-8。这本身不是问题,但可能会导致 display/conversion 问题。

一般来说,您希望将 UTF-8 数据加载到 NVARCHAR 列中。