Grundlegendes zur Spalte varchar (max) 8000 und warum ich mehr als 8000 Zeichen darin speichern kann

12

In diesem Microsoft-Dokument ist +

n definiert die Stringlänge und kann einen Wert von 1 bis 8.000 annehmen. max gibt an, dass die maximale Speichergröße 2 ^ 31-1 Byte (2 GB) beträgt. Die Speichergröße ist die tatsächliche Länge der eingegebenen Daten + 2 Bytes.

Bitte helfen Sie mir, das zu verstehen.

Die maximale Zeichenanzahl für varchar scheint zu sein 8000, was weit weniger als 2GBWert von Daten ist.

Ich sehe, dass es in dieser varchar(max)Spalte einer bestimmten Tabelle Datensätze gibt , die len(mycolumn)> 100 000 haben. Somit weiß ich, dass ich weit mehr als 8000Zeichen in eine varchar(max)Spalte bekommen kann.

Frage 1: Wie 8000kommen die Charaktere ins Spiel und wo sollte ich darauf achten?

Frage 2 : Gibt eine .net-Daten-Reader-Abfrage zu dieser Spalte immer das vollständige Ergebnis mit mehr als 100.000 Zeichen zurück?

Peter PitLock
quelle
Beachten Sie, dass varchar(max)das einmal aufgerufen wurde textund als ein anderer Datentyp behandelt wurde.
Herr Lister
Vielleicht lesen Sie das ? Es bezieht sich auf 8K-Seitengrößen. Werte, die zu groß sind, um auf eine einzelne Seite zu passen (das Limit ist tatsächlich etwas größer als 8000), werden auf LOB_DATA-Seiten (Large OBject) gespeichert.
Justin

Antworten:

29

Ich kann verstehen, warum Sie das missverstehen - es ist ein bisschen schwierig. Diese sind alle gültig:

  • VARCHAR (1) - eine Zeichenkette
  • VARCHAR (4000) - 4.000 Zeichen
  • VARCHAR (8000) - 8.000 Zeichen - und wenn Sie eine Zahl für die Definition dieses Felds verwenden, ist dies die höchste NUMMER, die Sie verwenden können. Beachten Sie jedoch Folgendes:
  • VARCHAR (MAX) - dieser hält bis zu 2 GB.

Und ja, wenn Sie versuchen, Daten aus einem VARCHAR (MAX) -Feld abzurufen und jemand 2 GB darin gespeichert hat, schnallen Sie sich an.

Brent Ozar
quelle
2
and somebody stored 2GB in there, buckle up.- War mit ein paar Blob-Dateien dort
Ruslan
7

Frage 1: Wie kommen die 8000 Charaktere ins Spiel und wo sollte ich darauf achten?

Wenn Sie n auf 8000 setzen, werden 8000 Zeichen ins Spiel gebracht. Sie müssen die Referenzen zu Präzision, Skalierung und Länge (Transact-SQL) in Bezug auf char, nchar, nvarchar und varchar kennen. Im Gegensatz dazu bewirkt das Festlegen von n auf max (keine Anführungszeichen), dass SQL Server die maximale Anzahl von Bytes speichert (und zurückgibt) (wie in Ihrem Anführungszeichen erwähnt).

Frage 2: Gibt eine .net-Daten-Reader-Abfrage zu dieser Spalte immer das vollständige Ergebnis mit mehr als 100.000 Zeichen zurück?

Dies ist eine .Net-Frage (keine SQL Server-Frage), aber der .Net-Daten-Reader ruft einen Strom von Bytes ab. Ein Byte ist kein Zeichen, und SQL Server gibt Bytes (keine Zeichen) zurück. Wenn n auf 8000 festgelegt ist und der Datentyp nvarchar ist, gibt SQL Server bis zu 8000 Byte zurück, die der .NET-Datenleser als 4000 Unicode-Zeichen interpretieren kann. Wenn n auf 8000 festgelegt ist und der Datentyp varchar ist, gibt SQL Server bis zu 8000 Byte zurück, die der .NET-Datenleser als bis zu 8000 ANSI-Zeichen interpretieren kann. Wenn n auf max gesetzt ist und der Datentyp nvarchar ist, gibt SQL Server bis zu 2 ^ 31-1 Bytes zurück, die der .Net-Datenleser als bis zu (2 ^ 31-1) / 2 Zeichen interpretieren kann. Wenn n auf max gesetzt ist und der Datentyp varchar ist, gibt SQL Server bis zu 2 ^ 31-1 Bytes zurück, die der .Net-Datenleser als bis zu 2 ^ 31-1 ANSI-Zeichen interpretieren kann.

Wenn Sie "char" oder "varchar" (anstelle von "nchar" oder "nvarchar") auswählen, weil sie mehr "Zeichen" (genauer: Bytes) speichern können, müssen Sie sich bewusst sein, dass viele Unicode-Zeichen kein gleichwertiges ANSI-Zeichen haben (daher ein großer Teil unseres Zeichens) Nutzer auf der ganzen Welt können ihre lokalisierten / nativen Zeichen in Ihrer App nicht sehen.

Rechnung
quelle