Ne anlama geliyor nvarchar
?
Arasındaki fark nedir char
, nchar
, varchar
, ve nvarchar
SQL Server?
Ne anlama geliyor nvarchar
?
Arasındaki fark nedir char
, nchar
, varchar
, ve nvarchar
SQL Server?
Yanıtlar:
Temizlemek için ... ya da özetlemek için ...
nchar
ve Unicode karakterleri nvarchar
saklayabilir .char
ve Unicode karakterleri depolayamaz .varchar
char
ve nchar
edilir uzunlukta sabit olacak depolama alanı rezerv tüm bu alanı kullanmak bile belirttiğiniz karakter sayısı için.varchar
ve nvarchar
olan değişken uzunlukta sadece saklamak karakterler için boşluk yukarı kullanacaktır. Bu gibi depolama ayırmaz char
veyanchar
.nchar
ve nvarchar
iki kat daha fazla depolama alanı kaplayacağından, bunları yalnızca Unicode desteğine ihtiyacınız varsa kullanmak akıllıca olabilir .
n...
Sürümlerin cevabımın gösterdiğinden
Şimdiye kadar tüm cevaplar varchar
tek bayt, nvarchar
çift bayt olduğunu gösteriyor. Bunun ilk kısmı aslında aşağıda gösterildiği gibi harmanlamaya bağlıdır .
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
İadeler
Not 华
ve 国
karakterler hala temsil edilmemiştir VARCHAR
sürümü ve sessizce ile değiştirilmiştir ?
.
Aslında bu harmanlamada tek bir bayt tarafından reddedilebilecek hiç Çince karakter yok. Tek baytlık karakterler, tipik batı ASCII kümesidir.
Bu nedenle, bir, bir insert mümkündür nvarchar(X)
, bir kolon varchar(X)
sütun bir kesme hata ile başarısız (X her iki durumda da aynı olan bir sayıdır, q).
SQL Server 2012, destekleyen SC (Tamamlayıcı Karakter) harmanlamaları ekler UTF-16
. Bu harmanlamalarda tek bir nvarchar
karakter 2 veya 4 bayt sürebilir.
nchar ve char, nvarchar ve varchar gibi hemen hemen aynı şekilde çalışır. Aralarındaki tek fark, nchar / nvarchar Unicode karakterlerini depolamasıdır (genişletilmiş karakter kümelerinin kullanılmasını gerektiriyorsa gereklidir), ancak varchar içermez.
Unicode karakterler daha fazla depolama alanı gerektirdiğinden, nchar / nvarchar alanları iki kat daha fazla yer kaplar (örneğin, SQL Server'ın önceki sürümlerinde nvarchar alanının maksimum boyutu 4000'dir).
Bu soru kopyası bu bir .
Sadece bir şey daha eklemek için: nchar - verilere sondaki boşlukları ekler. nvarchar - verilere sondaki boşluklar eklemez.
Bu nedenle, veri kümenizi bir 'nchar' alanına göre filtreleyecekseniz, boşlukları kaldırmak için RTRIM'i kullanmak isteyebilirsiniz. BRAND adı verilen nchar (10) alanı NIKE kelimesini saklar. Kelimenin sağına 6 boşluk ekler. Bu nedenle, filtrelerken ifade şöyle olmalıdır: RTRIM (Fields! BRAND.Value) = "NIKE"
Umarım buradaki birine yardımcı olur, çünkü şimdi onunla biraz uğraşıyordum!
Mevcut cevapları özetleme ve düzeltme girişimim:
İlk olarak, char
ve nchar
buna karşın her zaman, saklanmasına dize kullanılabilir alan daha küçük olduğunda bile, depolama alanı sabit bir miktar kullanacak varchar
ve nvarchar
bu dizeyi (artı yükü iki bayt depolamak için gerekli olan kadar depolama alanı olarak yalnızca kullanacak, muhtemelen dize uzunluğunu saklamak için). Unutmayın, "var" değişken alanda olduğu gibi "değişken" anlamına gelir.
Anlamak için ikinci önemli nokta yani nchar
ve nvarchar
kullanma mağaza dizeleri tam oysa, her karakter iki bayt char
ve varchar
olacak harmanlama kod sayfası tarafından belirlenen bir kodlama kullanır genellikle (orada, istisnalar aşağıya bakınız rağmen) karakterinin başına tam bir byte olacak. Burada hatırlanması gereken temel şey, yani her karakter iki bayt kullanarak, karakterlerin çok geniş bir aralık, saklanabilir nchar
ve nvarchar
sen muhtemelen bunu uluslararası destek, istediğinizde çok daha iyi bir seçim olma eğilimindedir.
Şimdi bazı daha ince noktalar için.
İlk olarak nchar
ve nvarchar
sütunlar her zaman UCS-2 kullanarak veri depolar. Bu, karakter başına tam olarak iki bayt kullanılacağı ve Temel Çok Dilli Düzlemdeki (BMP) herhangi bir Unicode karakterin bir nchar
veya nvarchar
alan tarafından saklanabileceği anlamına gelir . Ancak, herhangi bir Unicode karakterinin saklanabileceği durum söz konusu değildir . Örneğin, Wikipedia'ya göre, Mısır hiyeroglifleri için kod noktaları BMP'nin dışında kalıyor. Bu nedenle, UTF-8'de temsil edilebilen Unicode dizeleri ve bir SQL Server nchar
veya nvarchar
alanda depolanamayan diğer gerçek Unicode kodlamaları vardır ve Mısır hiyerogliflerinde yazılmış dizeler bunlar arasında olacaktır. Neyse ki kullanıcılarınız muhtemelen bu senaryoda yazmazlar, ancak akılda tutulması gereken bir şeydir!
Başka kafa karıştırıcı ama diğer posterleri sermiştir ilginç nokta olduğunu char
ve varchar
harmanlama kod sayfası gerektiriyorsa alanları belirli karakterler için karakter iki bayt kullanabilir. (Martin Smith, Chinese_Traditional_Stroke_Order_100_CS_AS_KS_WS'nin bu davranışı nasıl sergilediğini gösterdiği mükemmel bir örnek veriyor.
GÜNCELLEME: SQL Server 2012'den itibaren, UTF-16 için nihayet tüm Unicode aralığını gerçekten kapsayabilen Latin1_General_100_CI_AS_SC kod sayfaları vardır .
char
: maksimum 8000 karakter uzunluğunda sabit uzunlukta karakter verileri.nchar
: maksimum 4000 karakter uzunluğunda sabit uzunluklu unicode veriler.Char
= 8 bit uzunlukNChar
= 16 bit uzunlukchar
8 bit uzunluğa sahip olamazdı. Uzunluğu depolamak zorunda değildir ve sabit uzunluk 8000 karaktere kadar olabilir.
nchar[(n)]
(Ulusal karakter)
n
dize uzunluğunu tanımlar ve 1 ile 4,000 arasında bir değer olmalıdır.n
bayttır.nvarchar [(n | max)]
(ulusal karakter değişiyor.)
n
dize uzunluğunu tanımlar ve 1 ile 4,000 arasında bir değer olabilir.max
maksimum depolama boyutunun 2 ^ 31-1 bayt (2 GB) olduğunu gösterir.char [(n)]
(karakter)
non-Unicode
dize verileri.n
dize uzunluğunu tanımlar ve 1 ile 8.000 arasında bir değer olmalıdır.n
bayttır.varchar [(n | max)]
(karakter değişiyor)
n
dize uzunluğunu tanımlar ve 1 ile 8.000 arasında bir değer olabilir.max
maksimum depolama boyutunun 2 ^ 31-1 bayt (2 GB) olduğunu gösterir.Başka bir fark uzunluktur. Hem nchar hem de nvarchar 4.000 karakter uzunluğunda olabilir. Ve char ve varchar 8000 karakter uzunluğunda olabilir. Ancak SQL Server için 2.147.483.648 karaktere kadar işleyebilen bir [n] varchar (max) da kullanabilirsiniz. (İki gigabayt, işaretli bir 4 bayt tam sayı.)
nchar, nvarchar'dan daha fazla alan gerektirir .
Örneğin,
Bir nchar (100), yalnızca 5 girseniz bile, her zaman 100 karakter depolar, kalan 95 karakter boşluklarla doldurulur. Bir nvarchar'da (100) 5 karakter depolamak 5 karakter kazandırır.
nchar (10), 10 uzunlukta sabit uzunluklu bir Unicode dizgidir. nvarchar (10), maksimum 10 uzunluğu olan değişken uzunlukta bir Unicode dizgidir. Genellikle, tüm veri değerleri 10 karakter ve sonuncusu ise birincisini kullanırsınız. uzunluklar değişirse.
nchar sabit uzunluktadır ve unicode karakterleri tutabilir. karakter başına iki bayt depolama kullanır.
varchar değişken uzunluktadır ve unicode karakterleri tutamaz. karakter başına bir bayt depolama kullanır.
UCS-2
(SQL Server tarafından kullanılan kodlama olur ki) her karakteri depolayan tam iki bayt, bkz msdn.microsoft.com/en-us/library/bb330962%28v=sql.90%29.aspx : SQL Server stores Unicode in the UCS-2 encoding scheme... UCS-2 is a fixed-length encoding that represents all characters as a 16-bit value (2 bytes)
. SQL Server 2008 SCSU sıkıştırmasını kullanabilir, ancak yine de UCS-2 kodlu Unicode dizelerinin sıkıştırmasıdır: msdn.microsoft.com/en-us/library/ee240835.aspx
NVARCHAR , Unicode karakterleri depolayabilir ve karakter başına 2 bayt alır.
nvarchar
her karakter için 2 bayt alır.