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
atau VARCHAR
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, itu NCHAR
atau NVARCHAR
. The N
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-8VARCHAR
, 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 dalam BINARY
kolom (dan menangani ketidaknyamanan seperti fungsi string SQL tidak berfungsi dengan baik, atau harus melihat data sebagai dump hex di manajer GUI DB Anda).