Saya sedang belajar T-SQL. Dari contoh yang saya lihat, untuk memasukkan teks ke dalam varchar()
sel, saya dapat menulis hanya string yang akan disisipkan, tetapi untuk nvarchar()
sel, setiap contoh awalan string dengan huruf N.
Saya mencoba kueri berikut pada tabel yang memiliki nvarchar()
baris, dan berfungsi dengan baik, jadi awalan N tidak diperlukan:
insert into [TableName] values ('Hello', 'World')
Mengapa string diawali dengan N dalam setiap contoh yang saya lihat?
Apa pro atau kontra dari menggunakan awalan ini?
sql
sql-server
character-encoding
unicode
qinking126
sumber
sumber
N
berarti Nasional, seperti dalam "Karakter Memvariasikan Nasional", lihat Tipe Data SQL ANSI Setara .VARCHAR
keNVARCHAR
ketika string literal saya adalah ASCII?".Jawaban:
NVarchar digunakan untuk Unicode. Jika database Anda tidak menyimpan data multibahasa, Anda dapat tetap menggunakan Varchar. Sebagai contoh:
N'abc'
cukup konversi string Anda ke unicode.sumber
U&'abc'
adalah cara yang tepat untuk menentukan string Unicode. Lihat SQL 2003 BNFSecara default SQL server menggunakan kode karakter Windows-1252 untuk varchar . Ini berisi sebagian besar karakter untuk bahasa berbasis latin (Inggris, Jerman, Perancis, dll.) Tetapi tidak mengandung karakter untuk bahasa berbasis non-latin (Polandia, Rusia, dll.). Seperti yang dinyatakan oleh @Pieter B, nvarchar digunakan untuk mengatasi masalah itu karena untuk Unicode yang berisi karakter-karakter yang hilang. Ini membutuhkan biaya, dibutuhkan dua kali lebih banyak ruang untuk menyimpan nvarchar daripada varchar.
Menempatkan N di depan string Anda memastikan karakter dikonversi ke Unicode sebelum ditempatkan ke dalam kolom nvarchar. Sebagian besar waktu Anda akan baik-baik saja meninggalkan N off, tetapi saya tidak akan merekomendasikan hal ini. Jauh lebih baik aman daripada menyesal.
sumber
Karena MS SQL Server memiliki dukungan yang buruk untuk UTF-8 dibandingkan dengan RDBMS lainnya.
MS SQL Server mengikuti konvensi, yang digunakan dalam Windows itu sendiri, bahwa string "sempit" (
char
dalam C ++,CHAR
atauVARCHAR
dalam SQL) dikodekan dalam "halaman kode" lama. Masalah dengan halaman kode adalah bahwa mereka memiliki jumlah karakter yang terbatas (kebanyakan adalah pengkodean byte tunggal, yang membatasi reportoire menjadi 256 karakter) dan dirancang di sekitar satu bahasa (atau kelompok bahasa dengan huruf yang sama). Ini membuatnya sulit untuk menyimpan data multibahasa. Misalnya, Anda tidak dapat menyimpan data Rusia dan Ibrani karena Rusia menggunakan halaman kode 1251 dan bahasa Ibrani menggunakan kode halaman 1255 .Unicode memecahkan masalah ini dengan menggunakan satu set karakter kode raksasa dengan ruang lebih dari satu juta karakter, cukup untuk mewakili setiap bahasa di dunia. Ada beberapa skema pengkodean Unicode; Microsoft lebih suka menggunakan UTF-16 , karena alasan historis . Karena UTF-16 mewakili string sebagai urutan unit kode 16-bit dan bukan 8-bit tradisional, diperlukan tipe karakter terpisah. Di MSVC ++, ini
wchar_t
. Dan dalam MS SQL, ituNCHAR
atauNVARCHAR
. TheN
singkatan dari "nasional" , yang tampaknya belakang untuk saya karena Unicode adalah tentang antar -nationalization, tapi itu terminologi ISO.Implementasi SQL lainnya memungkinkan Anda menyimpan teks UTF-8 dalam sebuah
VARCHAR
kolom. UTF-8 adalah pengkodean variabel-panjang (1-4 byte per karakter) yang dioptimalkan untuk kasus ketika data Anda sebagian besar dalam kisaran Latin Dasar (yang direpresentasikan sebagai 1 byte yang sama per karakter seperti ASCII), tetapi dapat mewakili setiap karakter Unicode. Dengan demikian, Anda akan menghindari masalah "dua kali lebih banyak ruang" yang disebutkan oleh bwalk2895.Sayangnya, MS SQL Server tidak mendukung UTF-8
VARCHAR
, jadi alih-alih Anda harus menggunakan UTF-16 sebagai gantinya (dan membuang ruang untuk teks ASCII), gunakan halaman kode non-Unicode (dan kehilangan kemampuan untuk mewakili karakter asing), atau menyimpan UTF-8 dalamBINARY
kolom (dan menangani ketidaknyamanan seperti fungsi string SQL tidak berfungsi dengan baik, atau harus melihat data sebagai dump hex di manajer GUI DB Anda).sumber