Varchar ve nvarchar arasındaki farkları yaz


59

Şu anda SQL Server 2012 veritabanımızda kullanıyoruz varcharve bunu değiştirmek istiyoruz nvarchar. Bunu yapmak için bir komut dosyası oluşturdum.

Sorum şu ki, SQL Server'ın varcharsütunlara ve nvarcharsütunlara nasıl yazdığı konusunda herhangi bir fark var mı? Endişelendiğim bazı arka uç prosedürlerimiz var.

Düzenleme:
Bunun işe yarayıp yaramadığından emin değil, ancak sütunların üzerinde dizinler, f / k veya kısıtlamalar yok.


Yanıtlar:


46

Unicode string değişmezlerini bir N öneki ile yazdığınızdan emin olmanız gerekir. Örneğin, temel veri türü şuysa, bunlar farklı çalışacaktır 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'រៀន';

Sonuçlar:

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

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

c
----
រៀន

Mobil cihazlarda bulunan veya gerçek Unicode karakterleri yerine kutu karakterleri gösteren tarayıcılarda eskimiş olanlar için, şöyle görünüyor:

görüntü tanımını buraya girin


37

En büyük endişe, nvarcharkarakter başına 2 bayt, oysa 1 varcharkullanır. Bu nedenle, * ile nvarchar(4000)aynı miktarda depolama alanı kullanır varchar(8000).

İki kat fazla depolama alanına ihtiyaç duyan tüm karakter verilerinize ek olarak, bu ayrıca:

  • nvarcharSatırları 8060 bayt satır sınırı / 8000 bayt karakter sütun sınırı içinde tutmak için daha kısa sütunlar kullanmanız gerekebilir .
  • nvarchar(max)Sütun kullanıyorsanız , satırdan daha erken bir şekilde kullanılmazlar varchar(max).
  • nvarchar900 baytlık dizin anahtarı sınırı içinde kalmak için daha kısa sütunlar kullanmanız gerekebilir (neden bu kadar büyük bir dizin anahtarı kullanmak isteyeceğinizi bilmiyorum, ama asla bilmiyorsunuz).

Bunun yanında, nvarcharistemci yazılımınızın Unicode ile çalışmak üzere oluşturulduğunu varsayarak çalışmak çok da farklı değil. SQL Server şeffaf bir varcharşekilde bir a çevirir nvarchar, bu nedenle değişmezde 2 baytlık (yani Unicode) karakterleri kullanmıyorsanız, dize değişmezleri için N önekine kesinlikle ihtiyacınız yoktur. Döküm unutmayın nvarchariçin varbinaryaynı yapmaktan daha verim farklı sonuçlar varchar. Önemli olan nokta, uygulamanın çalışmasını sağlamak için sürecin kolaylaştırılmasına yardımcı olan her varchar kelimesini hemen bir nvarchar literaline değiştirmek zorunda kalmayacağınızdır.

Veri sıkıştırma kullanırsanız * (hafif satır sıkıştırma yeterlidir, Enterprise Edition gerekli SQL Server 2016 SP1 önce genellikle bulacaksınız) ncharve nvarchardaha fazla yer kaplar charve varcharnedeniyle, (SCSU algoritmasını kullanarak) Unicode sıkıştırma .


17

Aşağıdakilerin büyük farklılıklar olduğunu düşünün:

  1. Nvarchar, UNICODE verilerini depolar. UNICODE veya çok dilli verileri saklama gereksinimleriniz varsa, nvarchar seçimdir. Varchar, ASCII verilerini depolar ve normal kullanım için veri seçiminiz olmalıdır.
  2. Bellek kullanımıyla ilgili olarak, nvarchar karakter başına 2 bayt kullanırken, varchar 1 kullanır.
  3. Bir VARCHAR'ın NVARCHAR'a KATILMASI, önemli bir performansa sahiptir.
  4. Veri eklerken bir N öneki gerekebilir: INSERT dbo.t (c) SELECT N'ʤ ʥ ʦ ʧ ʨ ';
  5. Bazı uzmanlar nvarchar'ı her zaman tavsiye eder, çünkü: tüm modern işletim sistemleri ve geliştirme platformları dahili olarak Unicode kullanıyor, çünkü varchar yerine nvarchar kullanmak, dönüşümleri kodlamaktan kaçınacak ve veritabanına her yazdığınızda

0

Mobil DB'den SQL Server 2005'e RDP Birleştirme Çoğaltması için nvarchar gerekliydi. Ayrıca LTrim (), RTrim () ve Trim () çok fazla kullanıldı, ancak nc .

Bunun son yıllarda değişip değişmediğinin farkında değilim, ancak nvarchar şimdi oluşturulan veritabanında kullanılan VS Pro 2017'de .NET Basit Üyelik Web Sitesi girişleri için kullanılan standart.


-3

NVarchar'ı Varchar üzerinden kullanıyorsanız ve MULTI-LINQUAL'i destekleme gereksiniminiz yoksa, DB, Yedeklemeler (yerel ve harici) için depolama alanını artırırsınız. Modern Veritabanları her ikisini de desteklemeli ve herhangi bir Dönüşüm izi, tasarımda göz önünde bulundurulmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.