Varchar (max) 8000 sütununu ve neden 8000'den fazla karakteri saklayabildiğimi anlama


13

Gönderen bu Microsoft doc, +

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. Depolama boyutu, girilen verinin gerçek uzunluğu + 2 bayt.

Lütfen bunu anlamama yardım et.

Varchar için maksimum karakterler , veri değerinden 8000çok daha az gibi görünüyor 2GB.

varchar(max)Belirli bir tablonun bu sütununda len(mycolumn)> 100 000 olan kayıtlar olduğunu görüyorum. Böylece 8000, bir varchar(max)sütuna karakterlerden daha fazla yol alabileceğimi biliyorum .

Soru 1:8000 Karakterler nasıl devreye giriyor ve nereden haberdar olmalıyım?

Soru 2 : Bu sütuna bir .net datareader sorgusu her zaman 100.000+ karakterle tam sonucu döndürür mü?


Not varchar(max)kez denilen textve farklı bir veri türü olarak muamele edilmiştir.
Bay Lister

Belki okumak bu ? Onun ilişkili 8K sayfa boyutları. Tek bir sayfaya sığmayacak kadar büyük değerler (sınır aslında 8000'den biraz daha büyüktür) LOB_DATA sayfalarına (Büyük OBject) kaydedilir.
Justin

Yanıtlar:


30

Bunu neden yanlış anladığını görebiliyorum - bu biraz zor. Bunların hepsi geçerlidir:

  • VARCHAR (1) - bir karakter dizesi
  • VARCHAR (4000) - 4.000 karakter
  • VARCHAR (8000) - 8.000 karakter - ve bu alanın tanımı için bir sayı kullanırsanız, kullanabileceğiniz en yüksek NUMBER, ancak bunu izleyin:
  • VARCHAR (MAX) - en fazla 2GB.

Ve evet, bir VARCHAR (MAX) alanından veri almaya çalışırsanız ve biri 2GB'ı orada saklarsa, tokalanır.


3
and somebody stored 2GB in there, buckle up.- Birkaç damla dosyası ile orada
Ruslan

7

Soru 1: 8000 karakter nasıl devreye giriyor ve nereden haberdar olmam gerekir?

N'yi 8000 olarak ayarlamak 8000 karakterin devreye girmesine neden olur. Char, nchar, nvarchar ve varchar ile ilgili Precision, Scale ve Length (Transact-SQL) referanslarının farkında olmanız gerekir . Buna karşılık, n'nin maksimuma ayarlanması (tırnak işaretleri olmadan) SQL Server'ın maksimum bayt sayısını (alıntıda belirtildiği gibi) depolamasına (ve geri vermesine) neden olur.

Soru 2: Bu sütuna bir .net datareader sorgusu her zaman 100.000+ karakterle tam sonucu döndürür mü?

Bu bir .Net (SQL Server değil) sorusudur, ancak .Net datareader bir bayt akışı getirir. Bayt bir karakter değildir ve SQL Server bayt (karakter değil) döndürür. N 8000 olarak ayarlanmışsa ve veri türü nvarchar ise, SQL Server 8000 bayta kadar döner. NET veri okuyucusu 4000 Unicode karakter olarak yorumlayabilir. N, 8000 olarak ayarlanmışsa ve veri türü varchar ise, SQL Server 8000 bayta kadar döndürür. NET veri okuyucusu 8000 ANSI karaktere kadar yorumlayabilir. N, maks olarak ayarlanırsa ve veri türü nvarchar ise, SQL Server .Net veri okuyucusunun (2 ^ 31-1) / 2 karaktere kadar yorumlayabileceği 2 ^ 31-1 bayta kadar döner. N, maks olarak ayarlanırsa ve veri türü varchar ise, SQL Server .Net veri okuyucusunun en fazla 2 ^ 31-1 ANSI karakteri olarak yorumlayabileceği 2 ^ 31-1 bayta kadar döner.

Daha fazla "karakter" (daha doğru: bayt) depolayabildikleri için char veya varchar (nchar veya nvarchar yerine) kullanmayı seçerseniz, birçok Unicode karakterin eşdeğer ANSI karakterinin (bu nedenle dünyanın kullanıcıları uygulamanızda yerel / yerel karakterlerini göremez).

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.