使用nzload加载特殊字符

时间:2015-12-30 21:55:57

标签: oracle unicode utf-8 netezza extended-ascii

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

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

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

1 个答案:

答案 0 :(得分:0)

我对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 Extension Toolkit中的rawtohex函数作为数据库内工具,就像我们在命令行中使用 od 一样。

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

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

此时,两列似乎与输入文件具有完全相同的数据。到目前为止,非常好。

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

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

根据这个输出,我打赌您正在将样本数据加载到VARCHAR列而不是NVARCHAR列中,我将其也是UTF-8加载。这本身不是一个问题,但可能会出现显示/转换问题。

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