Nói chung tất cả các điểm của bạn đều đúng. NLS_NCHAR_CHARACTERSET
xác định bộ ký tự cho NVARCHAR2
, et. al. trong khi NLS_CHARACTERSET
được sử dụng cho VARCHAR2
.
Tại sao bạn có thể thấy các ký tự Trung Quốc với
US7ASCII
?
Lý do là, bộ ký tự cơ sở dữ liệu của bạn và bộ ký tự máy khách của bạn (tức là xem NLS_LANG
giá trị) đều là US7ASCII
. Cơ sở dữ liệu của bạn sử dụng US7ASCII
và nó "cho rằng" máy khách cũng gửi dữ liệu bằng US7ASCII
. Do đó, nó không thực hiện bất kỳ chuyển đổi nào của các chuỗi, dữ liệu được chuyển từng bit từ máy khách sang máy chủ và ngược lại.
Do đó, bạn có thể sử dụng các ký tự thực sự không được hỗ trợ bởi US7ASCII
. Hãy lưu ý, trong trường hợp máy khách của bạn sử dụng bộ ký tự khác (ví dụ:khi bạn sử dụng Trình điều khiển được quản lý ODP.NET trong ứng dụng Windows), dữ liệu sẽ trở thành rác rưởi! Ngoài ra, nếu bạn muốn xem xét việc di chuyển bộ ký tự cơ sở dữ liệu, bạn cũng gặp phải vấn đề tương tự.
Một lưu ý khác:Tôi không nghĩ rằng bạn sẽ nhận được hành vi tương tự với các bộ ký tự khác, ví dụ:nếu cơ sở dữ liệu của bạn và máy khách của bạn đều sử dụng WE8ISO8859P1
Ví dụ. Cũng cần lưu ý rằng bạn thực sự đã cấu hình sai. Cơ sở dữ liệu của bạn sử dụng bộ ký tự US7ASCII
, NLS_LANG
của bạn giá trị cũng là US7ASCII
(rất có thể nó hoàn toàn không được đặt và Oracle mặc định nó thành US7ASCII
) nhưng bộ ký tự thực của SQL * Plus, tương ứng. cmd.exe
của bạn thiết bị đầu cuối rất có thể là CP950 hoặc CP936.
Nếu bạn muốn đặt mọi thứ đúng cách, bạn có thể đặt biến môi trường của mình NLS_LANG=.ZHT16MSWIN950
(CP936 dường như không được Oracle hỗ trợ) hoặc thay đổi mã hóa của bạn trước khi chạy sqlplus.exe
với lệnh chcp 437
. Với cài đặt thích hợp này, bạn sẽ không thấy bất kỳ ký tự Trung Quốc nào như bạn có thể mong đợi.