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?

Larutan

Hanya untuk membersihkan... atau meringkas...

  • nchar dan nvarchar dapat menyimpan Unicode karakter.
  • char dan varchar tidak dapat menyimpan Unicode karakter.
  • char dan nchar yang fixed-length yang ruang penyimpanan cadangan untuk jumlah karakter yang anda tentukan bahkan jika anda don't menggunakan semua ruang itu.
  • varchar dan nvarchar yang panjang variabel yang hanya akan menggunakan ruang untuk karakter anda simpan. Itu tidak akan memesan bagasi seperti char atau nchar.

nchar dan nvarchar akan mengambil dua kali lebih banyak ruang penyimpanan, sehingga mungkin akan bijaksana untuk menggunakan mereka hanya jika anda perlu Unicode dukungan.

Komentar (10)

Semua jawaban sejauh ini menunjukkan bahwa varchar adalah satu byte, nvarchar adalah dua byte. Bagian pertama ini benar-benar tergantung pada pemeriksaan seperti yang digambarkan 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 dan karakter masih tidak terwakili dalam VARCHAR versi dan diam-diam diganti dengan ?.

Ada sebenarnya masih ada karakter Cina yang dapat reprsented oleh satu byte dalam pemeriksaan. Satu-satunya karakter byte tunggal yang khas barat ASCII set.

Karena ini adalah mungkin untuk menyisipkan dari nvarchar(X) kolom varchar(X) kolom gagal dengan pemotongan error (dimana X menyatakan nomor yang sama dalam kedua kasus).

SQL Server 2012 menambahkan SC (Karakter Tambahan) collations yang mendukung UTF-16. Dalam collations tunggal `nvarchar karakter dapat mengambil 2 atau 4 byte.

Komentar (1)

nchar dan char cukup banyak beroperasi dalam cara yang persis sama seperti satu sama lain, seperti yang dilakukan nvarchar dan varchar. Satu-satunya perbedaan antara mereka adalah bahwa nchar/nvarchar menyimpan karakter Unicode (penting jika anda memerlukan penggunaan diperpanjang set karakter) sementara varchar tidak.

Karena karakter Unicode membutuhkan lebih banyak penyimpanan, nchar/nvarchar bidang memakan waktu dua kali lebih banyak ruang (jadi misalnya di versi sebelumnya dari SQL Server ukuran maksimum nvarchar bidang 4000).

Pertanyaan ini adalah duplikat dari ini.

Komentar (1)

Hanya untuk menambahkan sesuatu yang lebih: nchar - menambah spasi tambahan untuk data. nvarchar - tidak menambahkan spasi tambahan untuk data.

Jadi, jika anda akan memfilter data dengan 'nchar' bidang, anda mungkin ingin menggunakan RTRIM untuk menghapus spasi. E. g. nchar(10) bidang yang disebut toko MEREK kata NIKE. Ia menambahkan 6 spasi ke kanan kata. Jadi, ketika penyaringan, ekspresi harus baca: RTRIM(Bidang!MEREK.Nilai) = "NIKE"

Semoga ini bisa membantu seseorang di luar sana karena saya berjuang dengan itu untuk sedikit saja sekarang!

Komentar (0)

Saya mencoba untuk meringkas dan benar yang ada jawaban:

Pertama, char dan nchar akan selalu menggunakan jumlah yang tetap dari ruang penyimpanan, bahkan ketika string yang akan disimpan lebih kecil dari pada ruang yang tersedia, sedangkan varchar dan nvarchar hanya akan menggunakan lebih banyak ruang penyimpanan yang diperlukan untuk menyimpan string (ditambah dua byte overhead, mungkin untuk menyimpan string yang panjang). Jadi ingat, "var" yang berarti "variabel", seperti pada variabel ruang.

Kedua titik utama yang harus dipahami adalah bahwa, nchar dan nvarchar toko string menggunakan tepat dua byte per karakter, sedangkan char dan varchar menggunakan pengkodean ditentukan oleh pemeriksaan kode halaman, yang akan biasanya sama persis satu byte per karakter (meskipun ada pengecualian, lihat di bawah). Dengan menggunakan dua byte per karakter, rentang yang sangat luas dari karakter yang dapat disimpan, sehingga hal dasar yang perlu diingat di sini adalah bahwa nchar dan nvarchar cenderung menjadi pilihan yang jauh lebih baik ketika anda ingin dukungan internasionalisasi, yang mungkin anda lakukan.

Sekarang untuk beberapa beberapa poin-poin penting.

Pertama, nchar dan nvarchar kolom selalu menyimpan data menggunakan UCS-2. Ini berarti bahwa tepat dua byte per karakter yang akan digunakan, dan setiap karakter Unicode di Basic Multilingual Plane (BMP) dapat disimpan oleh sebuah nchar atau nvarchar di bidang. Namun, itu bukan hal yang setiap karakter Unicode dapat disimpan. Misalnya, menurut Wikipedia, kode poin untuk hieroglif Mesir jatuh di luar BMP. Ada, oleh karena itu, Unicode string yang dapat direpresentasikan dalam UTF-8 dan lain benar Unicode pengkodean yang tidak dapat disimpan di SQL Server nchar atau nvarchar lapangan, dan string ditulis dalam hieroglif Mesir akan berada di antara mereka. Untungnya pengguna anda mungkin don't menulis dalam naskah itu, tapi itu's sesuatu untuk diingat!

Lain membingungkan tapi menarik bahwa poster lain yang harus digarisbawahi adalah bahwa char dan varchar bidang yang dapat menggunakan dua byte per karakter untuk karakter tertentu jika pemeriksaan kode halaman yang memerlukan. (Martin Smith memberikan contoh yang sangat baik di mana ia menunjukkan bagaimana Chinese_Traditional_Stroke_Order_100_cs_as_ks_ws menunjukkan perilaku ini. Check it out.)

UPDATE: Sebagai SQL Server 2012, ada akhirnya kode dalam halaman untuk UTF-16, misalnya Latin1_General_100_CI_AS_SC, yang benar-benar dapat menutupi seluruh Unicode berbagai.

Komentar (0)
  • char: tetap panjang data karakter dengan panjang maksimal 8000 karakter.
  • nchar: tetap panjang unicode data dengan panjang maksimal 4000 karakter.
  • Char = 8 bit panjang
  • NChar = 16 bit panjang
Komentar (1)

nchar[(n)] (karakter bangsa)

  • Fixed-length Unicode data string.
  • n mendefinisikan string panjang dan harus bernilai dari 1 sampai 4,000.
  • Ukuran penyimpanan dua kali n byte.

nvarchar [(n | max)] (national karakter yang berbeda-beda.)

  • Variabel-panjang Unicode data string.
  • n mendefinisikan string panjang dan dapat menjadi nilai dari 1 sampai 4,000.
  • max menunjukkan bahwa ukuran penyimpanan maksimum 2^31-1 byte (2 GB).
  • Ukuran penyimpanan, dalam byte, adalah dua kali panjang sebenarnya dari data yang dimasukkan + 2 byte

char [(n)] (karakter)

  • Fixed-length, non-Unicode data string.
  • n mendefinisikan string panjang dan harus bernilai dari 1 sampai 8,000.
  • Ukuran penyimpanan n byte.

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

  • Variabel-panjang, non-Unicode data string.
  • n mendefinisikan string panjang dan dapat menjadi nilai dari 1 sampai 8,000.
  • max menunjukkan bahwa ukuran penyimpanan maksimum 2^31-1 byte (2 GB).
  • Penyimpanan ukuran panjang sebenarnya dari data yang dimasukkan + 2 byte.
Komentar (0)

nchar membutuhkan lebih dari nvarchar.

misalnya,

Char(100) akan selalu menyimpan 100 karakter bahkan jika anda hanya memasukkan 5, sisanya 95 karakter akan diisi dengan spasi. Menyimpan 5 karakter varchar(100) akan menyimpan 5 karakter.

Komentar (1)

Perbedaan adalah:

  1. n[var]char toko unicode sementara [var]char hanya toko-toko yang single-byte karakter.
  2. [n]char membutuhkan tetap jumlah karakter dari panjang yang tepat saat [n]varchar menerima variabel jumlah karakter sampai dengan dan termasuk didefinisikan panjang.

Perbedaan lain adalah suhu udara. Kedua nchar dan nvarchar bisa sampai 4.000 karakter. Dan char dan varchar bisa sampai 8000 karakter. Tapi untuk SQL Server anda juga dapat menggunakan [n]varchar(max) yang dapat menangani hingga 2,147,483,648 karakter. (Dua gigabyte, yang ditandatangani 4-byte integer.)

Komentar (0)

nchar(10) adalah fixed-length string Unicode panjang 10. nvarchar(10) adalah variabel-panjang Unicode string dengan panjang maksimal 10. Biasanya, anda akan menggunakan mantan jika semua nilai data 10 karakter dan kedua jika panjang yang bervariasi.

Komentar (1)
  • nchar tetap-panjang dan dapat menyimpan karakter unicode. menggunakan dua bytes penyimpanan per karakter.

  • varchar panjang variabel dan tidak dapat menyimpan karakter unicode. menggunakan satu byte penyimpanan per karakter.

Komentar (3)

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

Komentar (3)