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 2GB
Wert 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 8000
Zeichen in eine varchar(max)
Spalte bekommen kann.
Frage 1: Wie 8000
kommen 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?
quelle
varchar(max)
das einmal aufgerufen wurdetext
und als ein anderer Datentyp behandelt wurde.Antworten:
Ich kann verstehen, warum Sie das missverstehen - es ist ein bisschen schwierig. Diese sind alle gültig:
Und ja, wenn Sie versuchen, Daten aus einem VARCHAR (MAX) -Feld abzurufen und jemand 2 GB darin gespeichert hat, schnallen Sie sich an.
quelle
and somebody stored 2GB in there, buckle up.
- War mit ein paar Blob-Dateien dortWenn 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).
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.
quelle