我在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
任何人都可以提供任何帮助吗?
答案 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列中。