Apa perbedaan antara char, nchar, varchar, dan nvarchar di SQL Server?

624

Apa yang dimaksud dengan nvarchar?

Apa perbedaan antara char, nchar, varchar, dan nvarchardi SQL Server?

MrDatabase
sumber

Jawaban:

858

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 .

Brian Kim
sumber
15
char dan varchar tidak dimaksudkan untuk menyimpan unicode, tetapi dengan beberapa trik pengkodean tambahan dan logika tambahan, Anda masih dapat menyalahgunakan bidang char [var] untuk penyimpanan unicode.
Wim ten Brink
10
Sangat tergantung apakah n...versi mengambil ruang penyimpanan dua kali lebih banyak dari jawaban saya
Martin Smith
7
Apa keuntungan pemesanan tempat penyimpanan?
mlissner
4
Pada poin terakhir: Menggunakan Unicode nchar dan nvarchar masih lebih baik dalam kebanyakan kasus, pemeriksaan yang lebih baik, fleksibilitas bagi pengguna, menghilangkan masalah kompatibilitas di masa depan. Dan omong-omong ruang penyimpanan bukan merupakan masalah untuk kasus ini, karena menggunakan collation tanpa Unicode adalah banyak kerumitan, dan tingkat memori akan terus menurun di masa depan
Jaison Varghese
6
@BenCaine char (20) akan menggunakan 20 byte (dengan asumsi 8-bit collation); varchar (20) akan menggunakan len (data) +2 byte, yaitu 22 untuk 20 byte data, tetapi hanya 12 untuk 10 byte data. Dua byte ekstra adalah catatan panjang. Jika data Anda akan selalu panjang penuh, maka gunakan char, karena menghemat ruang dan mungkin lebih cepat. Tolong jangan pernah menggunakan varchar (1), atau memang sesuatu yang lebih kecil dari varchar (4). Satu karakter dalam format varchar menggunakan tiga byte, jadi char (3) tidak akan pernah menggunakan lebih banyak ruang daripada varchar (3).
Richard Gadsden
95

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

masukkan deskripsi gambar di sini

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.

Martin Smith
sumber
4
Jenis jawaban yang saya cari. Juga untuk menghemat waktu bagi orang-orang seperti saya - teks non-Inggris diterjemahkan ke "Republik Rakyat Cina" translate.google.com/#auto/en/…
Igand
34

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 .

Luke Bennett
sumber
3
Anda lupa satu hal: nchar menggunakan panjang tetap sehingga nchar (10) selalu perlu menerima sepuluh karakter. Dan varchar (10) memang Unicode dan akan menerima sejumlah karakter, hingga 10 karakter. Juga lihat msdn.microsoft.com/en-us/library/ms186939.aspx
Wim ten Brink
33

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!

Dimuthu
sumber
24

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.

PeterAllenWebb
sumber
14
  • char: data karakter tetap-panjang dengan panjang maksimum 8000 karakter.
  • nchar: data unicode dengan panjang tetap dengan panjang maksimum 4000 karakter.
  • Char = Panjang 8 bit
  • NChar = Panjang 16 bit
ss.
sumber
chartidak dapat memiliki panjang 8-bit. Itu tidak harus menyimpan panjangnya, dan panjang tetap bisa hingga 8000 karakter.
John B. Lambe
12

nchar[(n)] (karakter nasional)

  • Data string Unicode dengan panjang tetap .
  • n mendefinisikan panjang string dan harus berupa nilai dari 1 hingga 4.000.
  • Ukuran penyimpanan dua kali nbyte.

nvarchar [(n | max)] (karakter nasional bervariasi.)

  • Data string Unicode -panjang variabel .
  • 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).
  • Ukuran penyimpanan, dalam byte, adalah dua kali panjang data aktual yang dimasukkan + 2 byte

char [(n)] (karakter)

  • Panjang tetap, non-Unicodedata string.
  • n mendefinisikan panjang string dan harus berupa nilai dari 1 hingga 8.000.
  • Ukuran penyimpanannya adalah nbyte.

varchar [(n | max)] (karakter bervariasi)

  • Panjang - data variabel, non-Unicode .
  • 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).
  • Ukuran penyimpanan adalah panjang sebenarnya dari data yang dimasukkan + 2 byte.
Rasel
sumber
7

Perbedaannya adalah:

  1. n [var] char menyimpan unicode sementara [var] char hanya menyimpan karakter byte tunggal.
  2. [n] char membutuhkan jumlah karakter tetap dengan panjang yang tepat sementara [n] varchar menerima sejumlah variabel karakter hingga dan termasuk panjang yang ditentukan.

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.)

Wim sepuluh Brink
sumber
7

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.

Venkataraman R
sumber
6
Tidak sepenuhnya benar, karena Anda diharuskan mengisi char (100) hingga 100 karakter. Anda akan menggunakan ini ketika Anda mis. Menyimpan nomor telepon dalam basis data Anda, atau memesan nomor dengan panjang tetap. Karena panjang bidang sudah diperbaiki, Anda tidak punya pilihan untuk mengisinya hingga jumlah karakter maksimum. Tetapi ketika semua data Anda adalah 100 karakter per catatan, char (100) akan mengambil lebih sedikit penyimpanan daripada varchar (100) karena tidak memerlukan indikasi panjang: setiap nilai akan tepat 100 karakter.
Wim ten Brink
5

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.

Jason Kresowaty
sumber
Perbandingan salah - pertanyaan berhubungan dengan nchar dan varchar, bukan nchar dan nvarchar.
Luke Bennett
4
  • 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.

Manu
sumber
Salah. Unicode dapat menggunakan 1 hingga 4 byte (secara umum) untuk setiap karakter. Juga, varchar dapat menyimpan unicode, tetapi tidak diakui sebagai unicode. Akibatnya, varchar dianggap tidak dapat diandalkan untuk penyimpanan unicode. (Terutama karena ada risiko bahwa kode yang mengakses bidang akan menerjemahkannya dengan tidak benar.)
Wim ten Brink
@Alex: Saya pikir Anda mengatakan maksud Anda tetapi saya masih tidak setuju dengan Anda. Apa yang Anda katakan adalah bahwa sebuah int BISA bertahan lama jika panjangnya lebih kecil dari 2 ^ 32. Ini bukan hanya 'tidak dapat diandalkan', ini adalah batasan inheren yang membuatnya tidak mungkin untuk mencakup seluruh rentang nilai.
Manu
4
@ Workshop Alex: Salah. Unicode dikodekan sebagai 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
Remus Rusanu
2

NVARCHAR dapat menyimpan karakter Unicode dan membutuhkan 2 byte per karakter.

Gustavo Rubio
sumber
1
SALAH! Unicode menggunakan antara 1 dan 4 byte per karakter! Banyak orang lupa ini! Bahkan penggunaan UTF-16 dapat mengakibatkan beberapa karakter mengambil 4 byte, bukan 2, meskipun panjang umum akan 2 byte. Subformat tertentu dari Unicode mungkin membutuhkan lebih dari 4 byte!
Wim ten Brink
7
@ WimtenBrink - Pertanyaannya adalah tentang SQL Server dan nvarcharselalu membutuhkan 2 byte per karakter.
Martin Smith
@ Win, Anda benar ada beberapa penyandian untuk Unicode yang dapat menghasilkan jumlah byte yang berbeda. Tapi SQL Server tidak memberi Anda pilihan tentang pengkodean Unicode. SQL Server sebelum 2012 hanya menggunakan UCS-2, lebar dua byte, jadi Martin benar pada saat ia menulis jawabannya. Seperti jawaban lain di atas katakan, SQL Server 2012 sekarang menyediakan UTF-16, jadi dua byte untuk banyak karakter (yang ada di Unicode Basic Multiliingual Plane), empat byte untuk yang lain.
Concrete Gannet