Secara umum semua poin Anda benar. NLS_NCHAR_CHARACTERSET
mendefinisikan set karakter untuk NVARCHAR2
, et. Al. kolom sedangkan NLS_CHARACTERSET
digunakan untuk VARCHAR2
.
Mengapa mungkin Anda melihat karakter Cina dengan
US7ASCII
?
Alasannya adalah, set karakter database Anda dan set karakter klien Anda (yaitu lihat NLS_LANG
nilai) keduanya US7ASCII
. Basis data Anda menggunakan US7ASCII
dan itu "berpikir" juga klien mengirim data menggunakan US7ASCII
. Jadi itu tidak membuat konversi string, data ditransfer sedikit demi sedikit dari klien ke server dan sebaliknya.
Karena itu, Anda dapat menggunakan karakter yang sebenarnya tidak didukung oleh US7ASCII
. Sadarilah, jika klien Anda menggunakan set karakter yang berbeda (misalnya ketika Anda menggunakan ODP.NET Managed Driver dalam aplikasi Windows) data akan menjadi sampah! Juga jika Anda akan mempertimbangkan migrasi kumpulan karakter basis data, Anda memiliki masalah yang sama.
Catatan lain:Saya tidak berpikir Anda akan mendapatkan perilaku yang sama dengan set karakter lain, mis. jika database Anda dan klien Anda akan menggunakan WE8ISO8859P1
Misalnya. Perlu diketahui juga bahwa Anda sebenarnya memiliki konfigurasi yang salah. Basis data Anda menggunakan kumpulan karakter US7ASCII
, NLS_LANG
. Anda nilainya juga US7ASCII
(kemungkinan besar tidak disetel sama sekali dan Oracle default ke US7ASCII
) tetapi kumpulan karakter asli SQL*Plus, resp. cmd.exe
Anda terminal kemungkinan besar adalah CP950 atau CP936.
Jika Anda ingin mengatur semuanya dengan benar, Anda dapat mengatur variabel lingkungan NLS_LANG=.ZHT16MSWIN950
(CP936 tampaknya tidak didukung oleh Oracle) atau ubah halaman kode Anda sebelum menjalankan sqlplus.exe
dengan perintah chcp 437
. Dengan pengaturan yang tepat ini, Anda tidak akan melihat karakter Cina seperti yang mungkin Anda harapkan.