Apa yang dimaksud dengan nvarchar?
Apa perbedaan antara char, nchar, varchar, dan nvarchardi SQL Server?
Apa yang dimaksud dengan nvarchar?
Apa perbedaan antara char, nchar, varchar, dan nvarchardi SQL Server?
Jawaban:
Hanya untuk menjernihkan ... atau meringkas ...
nchardan nvarchardapat menyimpan karakter Unicode .chardan tidak dapat menyimpan karakter Unicode .varchar chardan ncharmemiliki panjang tetap yang akan menyimpan ruang penyimpanan untuk sejumlah karakter yang Anda tentukan meskipun Anda tidak menggunakan semua ruang itu.varchardan nvarcharyang variabel-panjang yang hanya akan menggunakan ruang untuk karakter Anda menyimpan. Ini tidak akan memesan penyimpanan seperti charataunchar .nchardan nvarcharakan 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 varcharadalah 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 VARCHARversi 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 nvarcharkarakter 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, chardan ncharakan selalu menggunakan jumlah ruang penyimpanan tetap, bahkan ketika string yang akan disimpan lebih kecil dari ruang yang tersedia, sedangkan varchardan nvarcharhanya 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, nchardannvarchar menyimpan string menggunakan tepat dua byte per karakter, sedangkan chardan varcharmenggunakan 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 nchardan nvarcharcenderung menjadi pilihan yang jauh lebih baik ketika Anda menginginkan dukungan internasionalisasi, yang mungkin Anda lakukan.
Sekarang untuk beberapa poin yang lebih baik.
Pertama, nchardan nvarcharkolom 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 ncharatau 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 ncharatau nvarcharbidang, 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 chardan varcharbidang 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 bitchartidak 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.nbyte.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-Unicodedata string.n mendefinisikan panjang string dan harus berupa nilai dari 1 hingga 8.000.nbyte.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.
nvarcharselalu membutuhkan 2 byte per karakter.