Apa yang dimaksud dengan nvarchar
?
Apa perbedaan antara char
, nchar
, varchar
, dan nvarchar
di SQL Server?
Apa yang dimaksud dengan nvarchar
?
Apa perbedaan antara char
, nchar
, varchar
, dan nvarchar
di SQL Server?
Jawaban:
Hanya untuk menjernihkan ... atau meringkas ...
nchar
dan nvarchar
dapat menyimpan karakter Unicode .char
dan tidak dapat menyimpan karakter Unicode .varchar
char
dan nchar
memiliki panjang tetap yang akan menyimpan ruang penyimpanan untuk sejumlah karakter yang Anda tentukan meskipun Anda tidak menggunakan semua ruang itu.varchar
dan nvarchar
yang variabel-panjang yang hanya akan menggunakan ruang untuk karakter Anda menyimpan. Ini tidak akan memesan penyimpanan seperti char
ataunchar
.nchar
dan nvarchar
akan memakan ruang penyimpanan dua kali lebih banyak, jadi mungkin bijaksana untuk menggunakannya hanya jika Anda memerlukan dukungan Unicode .
n...
versi mengambil ruang penyimpanan dua kali lebih banyak dari jawaban saya
Semua 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.
DECLARE @T TABLE
(
C1 VARCHAR(20) COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS,
C2 NVARCHAR(20)COLLATE Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS
)
INSERT INTO @T
VALUES (N'中华人民共和国',N'中华人民共和国'),
(N'abc',N'abc');
SELECT C1,
C2,
LEN(C1) AS [LEN(C1)],
DATALENGTH(C1) AS [DATALENGTH(C1)],
LEN(C2) AS [LEN(C2)],
DATALENGTH(C2) AS [DATALENGTH(C2)]
FROM @T
Kembali
Perhatikan bahwa karakter 华
dan 国
masih belum terwakili dalam VARCHAR
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 ke varchar(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 satu nvarchar
karakter dapat mengambil 2 atau 4 byte.
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 .
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!
Upaya saya untuk merangkum dan mengoreksi jawaban yang ada:
Pertama, char
dan nchar
akan selalu menggunakan jumlah ruang penyimpanan tetap, bahkan ketika string yang akan disimpan lebih kecil dari ruang yang tersedia, sedangkan varchar
dan nvarchar
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, sedangkan char
dan varchar
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 bahwa nchar
dan nvarchar
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
dan nvarchar
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 bidang nchar
atau nvarchar
. 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 Server nchar
atau nvarchar
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
dan varchar
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.
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 bitchar
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).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.)
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.
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.
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.
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.aspx
NVARCHAR dapat menyimpan karakter Unicode dan membutuhkan 2 byte per karakter.
nvarchar
selalu membutuhkan 2 byte per karakter.