Tulis perbedaan antara varchar dan nvarchar

59

Saat ini dalam database SQL Server 2012 kami, kami gunakan varchar, dan kami ingin mengubahnya nvarchar. Saya telah membuat skrip untuk melakukan itu.

Pertanyaan saya adalah apakah ada perbedaan dalam cara SQL Server menulis ke varcharkolom vs. nvarcharkolom? Kami memiliki sejumlah prosedur backend yang saya khawatirkan.

Sunting:
Tidak yakin apakah ini membantu, tetapi kolom tidak memiliki indeks, f / k, atau kendala pada mereka.

Chris L
sumber
1
Lihat juga dba.stackexchange.com/questions/162113/…
Aaron Bertrand

Jawaban:

46

Anda harus yakin bahwa Anda awalan string Unicode literal dengan awalan N. Misalnya ini akan bekerja secara berbeda jika tipe data yang mendasarinya adalah NVARCHAR:

CREATE TABLE dbo.t(c NVARCHAR(32));

INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';

SELECT c FROM dbo.t;

SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';

Hasil:

c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!

c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?

c
----
រៀន

Bagi mereka yang menggunakan perangkat seluler atau browser jompo yang menampilkan karakter kotak alih-alih karakter Unicode yang sebenarnya, seperti inilah tampilannya:

masukkan deskripsi gambar di sini

Aaron Bertrand
sumber
37

Perhatian terbesar adalah yang nvarcharmenggunakan 2 byte per karakter, sedangkan varcharmenggunakan 1. Dengan demikian, nvarchar(4000)menggunakan jumlah ruang penyimpanan yang sama dengan varchar(8000)*.

Selain semua data karakter Anda yang membutuhkan ruang penyimpanan dua kali lebih banyak, ini juga berarti:

  • Anda mungkin harus menggunakan nvarcharkolom yang lebih pendek untuk menjaga baris dalam batas kolom 8060 byte / 8000 byte karakter kolom.
  • Jika Anda menggunakan nvarchar(max)kolom, kolom itu akan didorong lebih cepat daripada yang varchar(max)seharusnya.
  • Anda mungkin harus menggunakan nvarcharkolom yang lebih pendek untuk tetap berada dalam batas kunci indeks 900-byte (saya tidak tahu mengapa Anda ingin menggunakan kunci indeks yang besar, tetapi Anda tidak pernah tahu).

Selain itu, bekerja dengan nvarchartidak jauh berbeda, dengan asumsi perangkat lunak klien Anda dibuat untuk menangani Unicode. SQL Server akan secara transparan mengkonversi varcharke nvarchar, jadi Anda tidak benar-benar membutuhkan awalan N untuk literal string kecuali jika Anda menggunakan karakter 2-byte (yaitu Unicode) dalam literal. Sadarilah bahwa pengecoran nvarcharuntuk varbinarymenghasilkan hasil yang berbeda daripada melakukan hal yang sama dengan varchar. Poin penting adalah bahwa Anda tidak harus segera mengubah setiap varchar literal ke nvarchar literal agar aplikasi tetap berfungsi, yang membantu mempermudah proses.

* Jika Anda menggunakan kompresi data (kompresi baris ringan sudah cukup, Edisi Enterprise diperlukan sebelum SQL Server 2016 SP1 ) Anda biasanya akan menemukan nchardan nvarchartidak mengambil lebih banyak ruang daripada chardan varchar, karena kompresi Unicode (menggunakan algoritma SCSU) .

db2
sumber
17

Pikirkan yang berikut ini adalah perbedaan utama:

  1. Nvarchar menyimpan data UNICODE. Jika Anda memiliki persyaratan untuk menyimpan data UNICODE atau multibahasa, nvarchar adalah pilihannya. Varchar menyimpan data ASCII dan harus menjadi tipe data pilihan Anda untuk penggunaan normal.
  2. Mengenai penggunaan memori, nvarchar menggunakan 2 byte per karakter, sedangkan varchar menggunakan 1.
  3. BERGABUNG dengan VARCHAR ke NVARCHAR memiliki kinerja yang luar biasa.
  4. Mungkin memerlukan awalan N saat memasukkan data: INSERT dbo.t (c) SELECT N'ʤ ʥ ʦ ʧ ʨ ';
  5. Beberapa ahli merekomendasikan nvarchar selalu karena: karena semua sistem operasi modern dan platform pengembangan menggunakan Unicode secara internal, menggunakan nvarchar daripada varchar, akan menghindari pengkodean konversi setiap kali Anda membaca dari atau menulis ke database
rchacko
sumber
0

nvarchar diperlukan untuk Replikasi Penggabungan RDP dari Mobile DB ke SQL Server 2005. Juga LTrim (), RTrim () & Trim () banyak digunakan bc nvarchar tidak secara otomatis memangkas () ruang dari entri data, sedangkan Varchar tidak .

Saya tidak tahu apakah itu telah berubah dalam beberapa tahun terakhir atau tidak, tetapi nvarchar sekarang menjadi standar yang digunakan untuk login .NET Simple Membership Website di VS Pro 2017 yang digunakan dalam database yang dihasilkan.

Joseph Poirier
sumber
-3

Jika Anda menggunakan NVarchar lebih dari Varchar dan Anda tidak memiliki persyaratan untuk mendukung MULTI-LINQUAL, Anda meningkatkan penyimpanan untuk DB, Cadangan (lokal dan luar lokasi). Database modern harus mendukung keduanya dan setiap klik Konversi harus dipertimbangkan dalam desain.

Bill Lindsay
sumber