Apa yang dimaksud dengan nvarchar
?
Apa perbedaan antara char
, nchar
, varchar
, dan nvarchar
di SQL Server?
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.
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.
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.
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!
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.
nchar[(n)]
(karakter bangsa)
n
mendefinisikan string panjang dan harus bernilai dari 1 sampai 4,000.n
byte.nvarchar [(n | max)]
(national karakter yang berbeda-beda.)
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).char [(n)]
(karakter)
non-Unicode
data string.n
mendefinisikan string panjang dan harus bernilai dari 1 sampai 8,000.n
byte.varchar [(n | max)]
(karakter menyesuaikan)
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).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.
Perbedaan adalah:
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.)
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.