Apa yang dimaksud dengan nvarchar
?
Apa perbedaan antara char
, nchar
, varchar
, dan nvarchar
di SQL Server?
sql-server
varchar
MrDatabase
sumber
sumber
n...
versi mengambil ruang penyimpanan dua kali lebih banyak dari jawaban sayaSemua jawaban sejauh ini menunjukkan bahwa itu
varchar
adalah byte tunggal,nvarchar
adalah byte ganda. Bagian pertama ini sebenarnya tergantung pada susunan seperti diilustrasikan di bawah ini.Kembali
Perhatikan bahwa karakter
华
dan国
masih belum terwakili dalamVARCHAR
versi dan diganti dengan diam-diam?
.Sebenarnya masih belum ada karakter Cina yang dapat diwakili oleh satu byte dalam susunan itu. Satu-satunya karakter byte tunggal adalah set ASCII barat khas.
Karena hal ini dimungkinkan untuk memasukkan dari
nvarchar(X)
kolom kevarchar(X)
kolom gagal dengan kesalahan pemotongan (di mana X menunjukkan angka yang sama dalam kedua contoh).SQL Server 2012 menambahkan koleksi SC (Supplementary Character) yang mendukung
UTF-16
. Dalam susunan ini satunvarchar
karakter dapat mengambil 2 atau 4 byte.sumber
nchar dan char cukup banyak beroperasi dengan cara yang persis sama satu sama lain, seperti halnya nvarchar dan varchar. Satu-satunya perbedaan di antara mereka adalah bahwa nchar / nvarchar menyimpan karakter Unicode (penting jika Anda memerlukan penggunaan set karakter yang diperluas) sementara varchar tidak.
Karena karakter Unicode memerlukan lebih banyak penyimpanan, bidang nchar / nvarchar mengambil ruang dua kali lebih banyak (jadi misalnya dalam versi SQL Server sebelumnya, ukuran maksimum bidang nvarchar adalah 4000).
Pertanyaan ini merupakan duplikat dari pertanyaan ini .
sumber
Hanya untuk menambahkan sesuatu yang lebih: nchar - menambahkan spasi tambahan ke data. nvarchar - tidak menambahkan spasi tambahan ke data.
Jadi, jika Anda akan memfilter dataset Anda dengan bidang 'nchar', Anda mungkin ingin menggunakan RTRIM untuk menghapus spasi. Misalnya nchar (10) bidang yang disebut BRAND menyimpan kata NIKE. Ini menambahkan 6 spasi di sebelah kanan kata. Jadi, saat memfilter, ekspresi harus berbunyi: RTRIM (Fields! BRAND.Value) = "NIKE"
Semoga ini bisa membantu seseorang di luar sana karena saya sedang bergumul dengan hal itu sekarang!
sumber
Upaya saya untuk merangkum dan mengoreksi jawaban yang ada:
Pertama,
char
dannchar
akan selalu menggunakan jumlah ruang penyimpanan tetap, bahkan ketika string yang akan disimpan lebih kecil dari ruang yang tersedia, sedangkanvarchar
dannvarchar
hanya akan menggunakan ruang penyimpanan sebanyak yang diperlukan untuk menyimpan string itu (ditambah dua byte overhead, mungkin untuk menyimpan panjang string). Jadi ingat, "var" berarti "variabel", seperti dalam ruang variabel.Poin utama kedua yang harus dipahami adalah,
nchar
dannvarchar
menyimpan string menggunakan tepat dua byte per karakter, sedangkanchar
danvarchar
menggunakan pengkodean ditentukan oleh halaman kode susunan, yang biasanya akan tepat satu byte per karakter (meskipun ada pengecualian, lihat di bawah). Dengan menggunakan dua byte per karakter, rentang karakter yang sangat luas dapat disimpan, jadi hal dasar yang perlu diingat di sini adalah bahwanchar
dannvarchar
cenderung menjadi pilihan yang jauh lebih baik ketika Anda menginginkan dukungan internasionalisasi, yang mungkin Anda lakukan.Sekarang untuk beberapa poin yang lebih baik.
Pertama,
nchar
dannvarchar
kolom selalu menyimpan data menggunakan UCS-2. Ini berarti bahwa tepat dua byte per karakter akan digunakan, dan setiap karakter Unicode di Basic Multilingual Plane (BMP) dapat disimpan oleh bidangnchar
ataunvarchar
. Namun, ini bukan kasus bahwa setiap karakter Unicode dapat disimpan. Misalnya, menurut Wikipedia, titik kode untuk hieroglif Mesir berada di luar BMP. Oleh karena itu, string Unicode yang dapat direpresentasikan dalam UTF-8 dan pengkodean Unicode sejati lainnya yang tidak dapat disimpan dalam SQL Servernchar
ataunvarchar
bidang, dan string yang ditulis dalam hieroglif Mesir akan ada di antara mereka. Untungnya, pengguna Anda mungkin tidak menulis dalam skrip itu, tetapi itu sesuatu yang perlu diingat!Hal lain yang membingungkan tetapi menarik yang disorot oleh poster lain adalah bahwa
char
danvarchar
bidang dapat menggunakan dua byte per karakter untuk karakter tertentu jika halaman kode kolasi memerlukannya. (Martin Smith memberikan contoh yang sangat baik di mana ia menunjukkan bagaimana bahasa Mandarin_Traditional_Stroke_Order_100_CS_AS_KS_WS menunjukkan perilaku ini. Coba lihat.)PEMBARUAN: Pada SQL Server 2012, akhirnya ada halaman kode untuk UTF-16 , misalnya Latin1_General_100_CI_AS_SC, yang benar-benar dapat mencakup seluruh rentang Unicode.
sumber
char
: data karakter tetap-panjang dengan panjang maksimum 8000 karakter.nchar
: data unicode dengan panjang tetap dengan panjang maksimum 4000 karakter.Char
= Panjang 8 bitNChar
= Panjang 16 bitsumber
char
tidak dapat memiliki panjang 8-bit. Itu tidak harus menyimpan panjangnya, dan panjang tetap bisa hingga 8000 karakter.nchar[(n)]
(karakter nasional)n
mendefinisikan panjang string dan harus berupa nilai dari 1 hingga 4.000.n
byte.nvarchar [(n | max)]
(karakter nasional bervariasi.)n
mendefinisikan panjang string dan bisa menjadi nilai dari 1 hingga 4.000.max
menunjukkan bahwa ukuran penyimpanan maksimum adalah 2 ^ 31-1 byte (2 GB).char [(n)]
(karakter)non-Unicode
data string.n
mendefinisikan panjang string dan harus berupa nilai dari 1 hingga 8.000.n
byte.varchar [(n | max)]
(karakter bervariasi)n
mendefinisikan panjang string dan bisa menjadi nilai dari 1 hingga 8.000.max
menunjukkan bahwa ukuran penyimpanan maksimum adalah 2 ^ 31-1 byte (2 GB).sumber
Perbedaannya adalah:
Perbedaan lainnya adalah panjang. Baik nchar dan nvarchar dapat memuat hingga 4.000 karakter. Dan char dan varchar dapat memuat hingga 8000 karakter. Tetapi untuk SQL Server Anda juga dapat menggunakan [n] varchar (maks) yang dapat menangani hingga 2.147.483.648 karakter. (Dua gigabytes, integer 4-byte yang ditandatangani.)
sumber
nchar membutuhkan lebih banyak ruang daripada nvarchar.
misalnya,
Sebuah nchar (100) akan selalu menyimpan 100 karakter bahkan jika Anda hanya memasukkan 5, 95 karakter yang tersisa akan diisi dengan spasi. Menyimpan 5 karakter dalam nvarchar (100) akan menghemat 5 karakter.
sumber
nchar (10) adalah string Unicode panjang-panjang tetap 10. nvarchar (10) adalah string Unicode-panjang variabel dengan panjang maksimum 10. Biasanya, Anda akan menggunakan yang pertama jika semua nilai data 10 karakter dan yang terakhir jika panjangnya bervariasi.
sumber
nchar memiliki panjang tetap dan dapat menampung karakter unicode. ini menggunakan penyimpanan dua byte per karakter.
varchar memiliki panjang variabel dan tidak dapat menampung karakter unicode. menggunakan penyimpanan satu byte per karakter.
sumber
UCS-2
(yang kebetulan pengkodean yang digunakan oleh SQL Server) menyimpan setiap karakter di persis dua byte, lihat msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx :SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 dapat menggunakan kompresi SCSU, tetapi masih kompresi string Unicode yang dikodekan UCS-2: msdn.microsoft.com/en-us/library/ee240835.aspxNVARCHAR dapat menyimpan karakter Unicode dan membutuhkan 2 byte per karakter.
sumber
nvarchar
selalu membutuhkan 2 byte per karakter.