Ne anlama geliyor nvarchar?
Arasındaki fark nedir char, nchar, varchar, ve nvarcharSQL Server?
Ne anlama geliyor nvarchar?
Arasındaki fark nedir char, nchar, varchar, ve nvarcharSQL Server?
Yanıtlar:
Temizlemek için ... ya da özetlemek için ...
ncharve Unicode karakterleri nvarcharsaklayabilir .charve Unicode karakterleri depolayamaz .varchar charve ncharedilir uzunlukta sabit olacak depolama alanı rezerv tüm bu alanı kullanmak bile belirttiğiniz karakter sayısı için.varcharve nvarcharolan değişken uzunlukta sadece saklamak karakterler için boşluk yukarı kullanacaktır. Bu gibi depolama ayırmaz charveyanchar .ncharve nvarchariki 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 varchartek 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 VARCHARsü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 nvarcharkarakter 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, charve ncharbuna karşın her zaman, saklanmasına dize kullanılabilir alan daha küçük olduğunda bile, depolama alanı sabit bir miktar kullanacak varcharve nvarcharbu 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 ncharve nvarcharkullanma mağaza dizeleri tam oysa, her karakter iki bayt charve varcharolacak 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 ncharve nvarcharsen muhtemelen bunu uluslararası destek, istediğinizde çok daha iyi bir seçim olma eğilimindedir.
Şimdi bazı daha ince noktalar için.
İlk olarak ncharve nvarcharsü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 ncharveya nvarcharalan 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 ncharveya nvarcharalanda 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 charve varcharharmanlama 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 uzunlukchar8 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.nbayttı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-Unicodedize verileri.n dize uzunluğunu tanımlar ve 1 ile 8.000 arasında bir değer olmalıdır.nbayttı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.
nvarcharher karakter için 2 bayt alır.