Microsoft SQL Server'da neden dizelerin önüne N koymamız gerekiyor?


34

T-SQL öğreniyorum. Gördüğüm örneklerden, bir varchar()hücreye metin eklemek için, sadece eklenecek dizeyi yazabiliyorum, ancak nvarchar()hücreler için her örnek dizeleri N harfiyle öneklendirdi.

Aşağıdaki sorguyu nvarchar()satır içeren bir tabloda denedim ve iyi çalışıyor, bu nedenle N öneki gerekli değil:

insert into [TableName] values ('Hello', 'World')

Gördüğüm her örnekte neden dizeler N'ye eklenmiş?

Bu öneki kullanmanın avantajları veya dezavantajları nelerdir?


N sadece değişmez dizgiler için gerekli değil mi?
Wayne In Yak,

Lehçe Latince olmayan bir dildir ????
Heckflosse_230

2
N"Ulusal Değişen Karakter" deki gibi Ulusal anlamına gelir, bkz. Eşdeğer ANSI SQL Veri Tipleri .
ErikE,

Bu soruya katılıyorum ve şu ana kadar kimse cevap vermedi, AFAICT. “Neden kötü SQL örtülü gözlerimi dönüştürmek izin vermektir olarak belki tekrar eski durumuna olabilir VARCHARiçin NVARCHARbenim dize ASCII olduğunda?”.
binki

Bu soru zaten soruldu ve burada cevaplandı: varchar ve nvarchar arasındaki fark nedir?

Yanıtlar:


27

NVarchar Unicode için kullanılır. Veritabanınız çok dilli veri kaydetmiyorsa Varchar'ı kullanmaya devam edebilirsiniz. Örnek olarak: N'abc'sadece dizginizi unicode'a dönüştürür.


2
Neden N yerine U ile önek girmek zorunda değilsin?
Attila Kun

U tahminsiz olarak imzasızlar için kafa karışıklığı yaşayabilir
JB King

U&'abc'Unicode dizelerini belirtmek için doğru yoldur. Bkz. SQL 2003 BNF
ceving

2
N aslında "Ulusal Dil Karakteri" setini ifade ediyor.
Mike Bovenlander

23

Varsayılan olarak, SQL sunucusu varchar için Windows-1252 karakter kodlarını kullanır . Latince tabanlı dillerin (İngilizce, Almanca, Fransızca vb.) Çoğu karakterini içerir. Latince tabanlı olmayan dillerin (Lehçe, Rusça vb.) Karakterlerini içermez. @ Pieter B tarafından belirtildiği gibi, nvarchar bu sorunu çözmek için kullanılır çünkü bu eksik karakterleri içeren Unicode için . Bu bir bedeli var, nvarchar saklamak için varchar iki kat daha fazla yer alır.

Dizenin önüne N koymak, karakterlerin bir nvarchar sütununa yerleştirilmeden önce Unicode'a dönüştürülmesini sağlar. Çoğu zaman N'yi bırakmakta sorun yaşarsınız, ama bunu tavsiye etmem. Üzgün ​​olmaktan çok güvende olmak daha iyidir.


3
Sadece bir açıklama: "Varsayılan olarak" SQL sunucusu, genellikle örneğiniz için varsayılan harmanlamayı temel alarak, alanın oluşturulduğu sırada geçersiz kılan Varchar alanının harmanlamasına karşılık gelen kodlamayı kullanır. Örneğin, varsayılan harmanlama yükleme zamanında ayarlanabilir, ancak genellikle sistem varsayılan yerel ayarının CP_ACP'sine karşılık gelir. Bu ABD-İngiliz bir makinede Windows 1252, Japonca sistem yerel ayarlı bir makinede 932, Rus bir makinede 1251 vb. Olacak. Hikayenin ahlaki mi? NVarchar kullanın :)
JasonTrue

1
Şimdiye kadar sorulan soruyu yanıtlayan tek cevap budur: "Niçin N önekini hazır kod dizelerinde kullanmalısınız, çünkü SQL dolaylı olarak kod değiştirir?". Diğer cevapların hepsi "Nvarchar ve varchar arasındaki fark nedir?"
Timbo,

18

Çünkü MS SQL Server, UTF-8'i diğer RDBMS'lere kıyasla daha az desteklemektedir.

MS SQL Server, Windows içinde kullanılan "dar" dizgilerin ( charC ++ CHARveya VARCHARSQL'de) eski "kod sayfasında" kodlandığı sözleşmesini izler . Kod sayfalarıyla ilgili sorun, sınırlı sayıda karaktere sahip olmalarıdır (çoğu, tek tek baytlı kodlamalardır, raporları 256 karakterle sınırlar) ve tek bir dilin (veya benzer alfabelere sahip dil ​​grubunun) etrafında tasarlanmış olmalarıdır. Bu, çok dilli verileri saklamayı zorlaştırır. Örneğin, hem Rusça hem de İbranice verilerini depolayamazsınız, çünkü Rusça kod sayfası 1251'i ve İbranice kod sayfası 1255'i kullanır .

Unicode , bu sorunu dünyadaki her dili temsil edecek kadar, bir milyondan fazla karaktere sahip tek bir dev kodlanmış karakter kullanarak çözer. Birkaç Unicode kodlama şeması vardır; Microsoft , tarihsel nedenlerden dolayı UTF-16'yı kullanmayı tercih ediyor . UTF-16, dizeleri geleneksel 8 bit yerine 16 bit kod birimleri dizisi olarak temsil ettiğinden, ayrı bir karakter türü gerekir. MSVC ++ 'da budur . Ve MS SQL'de, ya da . "Ulusal" anlamına gelir Unicode hakkında çünkü bana geriye tavır sergileyen arası -nationalization, ama bu ISO terminoloji bu.wchar_tNCHARNVARCHARN

Diğer SQL uygulamaları UTF-8 metnini bir VARCHARsütunda saklamanıza izin verir . UTF-8, verilerinizin çoğunlukla Temel Latin aralığında (ASCII ile karakter başına aynı 1 byte olarak temsil edilir) olduğu durumlarda optimize edilmiş, değişken uzunluklu (karakter başına 1-4 bayt) kodlamadır. herhangi bir Unicode karakteri. Böylece, bwalk2895 tarafından belirtilen "iki kat daha fazla alan" probleminden kaçınırsınız.

Ne yazık ki, MS SQL Server UTF-8'i desteklemiyorVARCHAR , bunun yerine bunun yerine UTF-16'yı kullanmanız (ve ASCII metni için boşa alan), Unicode olmayan bir kod sayfası kullanmanız (ve yabancı karakterleri temsil etme özelliğini kaybetmeniz), veya UTF-8'i bir BINARYsütunda saklayın (ve düzgün çalışmayan SQL string işlevleri gibi sakıncaları ya da verileri GUI DB yöneticinizde onaltılı bir döküm olarak görüntülemek zorunda kalmayın).


1
Daha önceki sürümlerde SQL Server 2012'den sonra, kesinlikle 2 bayt olan UCS-2 kodlamasını kullanıyorlar. Daha yeni sürümlerde, karakter başına 4 bayt ile değişken uzunluk eşlemesi olan UTF-16 kullanıyorlar (UTF-8 ile benzer ancak 2 bayttan başlayarak).
j123b567
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.