Tôi không hiểu lắm về các vấn đề chuyển đổi Unicode, nhưng tôi đã làm điều này với chính mình trước đây và tôi sẽ chứng minh những gì tôi nghĩ đang xảy ra.
Tôi tin rằng những gì bạn đang thấy ở đây không phải là vấn đề khi tải các ký tự đặc biệt với nzload, mà là vấn đề với cách phần mềm hiển thị / thiết bị đầu cuối của bạn hiển thị dữ liệu và / hoặc Netezza đang lưu trữ dữ liệu ký tự như thế nào. Tôi nghi ngờ có sự chuyển đổi kép sang / từ UTF-8 (mã hóa Unicode mà Netezza hỗ trợ). Hãy xem liệu chúng ta có thể hiểu được đó là gì không.
Ở đây tôi đang sử dụng PuTTY với Bộ ký tự từ xa mặc định (đối với tôi) là Latinh-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¿
Ở đây chúng ta có thể xem từ od rằng tệp chỉ có dữ liệu mà chúng tôi mong đợi, tuy nhiên khi chúng tôi cat tệp mà chúng tôi thấy ký tự phụ. Nếu nó không có trong tệp, thì ký tự có thể đến từ bản dịch hiển thị.
Nếu tôi thay đổi cài đặt PuTTY để UTF-8 làm bộ ký tự từ xa, chúng tôi sẽ thấy nó theo cách này:
$ 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¿
Vì vậy, cùng một dữ liệu nguồn, nhưng hai biểu diễn trên màn hình khác nhau, không phải ngẫu nhiên, giống như hai đầu ra khác nhau của bạn. Dữ liệu giống nhau có thể được hiển thị theo ít nhất hai cách.
Bây giờ chúng ta hãy xem cách nó tải vào Netezza, một lần vào cột VARCHAR và một lần nữa vào cột 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
Dữ liệu được tải không có lỗi. Lưu ý khi tôi chỉ định tùy chọn Escapepechar cho nzload , không có ký tự nào trong mẫu dữ liệu đầu vào cụ thể này yêu cầu phải thoát, cũng như không được thoát.
Bây giờ tôi sẽ sử dụng hàm rawtohex từ Bộ công cụ mở rộng SQL làm công cụ trong cơ sở dữ liệu giống như chúng tôi đã sử dụng od từ dòng lệnh.
select rawtohex(col1) from test_enc_vchar;
RAWTOHEX
------------------------------
50524F46455353494F4E414CC2BF
(1 row)
select rawtohex(col1) from test_enc_nvchar;
RAWTOHEX
------------------------------
50524F46455353494F4E414CC2BF
(1 row)
Tại thời điểm này, cả hai cột dường như có dữ liệu chính xác giống như tệp đầu vào. Cho đến nay, rất tốt.
Điều gì sẽ xảy ra nếu chúng ta chọn cột? Đối với bản ghi, tôi đang thực hiện việc này trong một phiên PuTTY với bộ ký tự từ xa là UTF-8.
select col1 from test_enc_vchar;
COL1
----------------
PROFESSIONAL¿
(1 row)
select col1 from test_enc_nvchar;
COL1
---------------
PROFESSIONAL¿
(1 row)
Cùng một dữ liệu nhị phân, nhưng hiển thị khác nhau. Nếu sau đó tôi sao chép đầu ra của từng lựa chọn đó vào echo được chuyển đến 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
Dựa trên kết quả này, tôi đánh cuộc rằng bạn đang tải dữ liệu mẫu của mình, dữ liệu này tôi cũng đánh cuộc là UTF-8, vào cột VARCHAR chứ không phải cột NVARCHAR. Bản thân đây không phải là vấn đề mà có thể có vấn đề về hiển thị / chuyển đổi.
Nói chung, bạn muốn tải dữ liệu UTF-8 vào các cột NVARCHAR.