In MS SQL Server (7.0 und höher), wird intern varchar-Daten dargestellt mit bis zu drei Werten:
- Die tatsächliche Folge von Zeichen, die von 0 bis etwas mehr als 8000 Bytes sein werden (es basiert auf Seitengröße, die anderen Spalten für die Zeile gespeichert ist, und ein paar andere Faktoren)
- zwei Bytes verwendet, um die Datenfolge, um anzuzeigen, wie lange ist (das einen Wert von 0 bis 8000+)
- Wenn die Spalte erzeugt Nullable, ein Bit in der Null-Bitmaske der Zeile (so kann der Nullstatus von bis zu acht nullbaren Spalten in einem Byte dargestellt werden)
Der wichtige Teil ist der Zwei-Byte-Datenlängenindikator. Wenn es ein Byte wäre, könnten Sie nur Strings der Länge 0 bis 255 richtig aufzeichnen; Mit zwei Bytes können Sie Strings der Länge 0 auf etwas über 64000+ (speziell 2^16 -1) aufzeichnen. Die Seitenlänge von SQL Server beträgt jedoch 8 KB. Dies ist der Ausgangspunkt für die maximale Zeichenanzahl von 8000 Zeichen. (Es gibt einen Datenüberlauf in SQL 2005, aber wenn Ihre Strings so lang sind, sollten Sie einfach mit varchar (max) gehen.)
Also, egal wie lange Sie Ihre Datentyp varchar Spalte deklarieren (15, 127, 511) zu sein, ist das, was Sie tatsächlich für jede Zeile werden die Speicherung wird:
- 2 Bytes anzuzeigen wie lange die Zeichenfolge
- die eigentliche Zeichenfolge, dh die Anzahl der Zeichen in diesem String
Was mich zu meinem Punkt bekommt: eine Reihe von älteren Systemen nur 1 Byte verwendet, um die String-Länge zu speichern, und dass beschränkt Sie auf eine maximale Länge von 255 Zeichen, die nicht alle t ist Hut lang. Bei 2 Bytes haben Sie kein solches willkürliches Limit ... und deshalb empfehle ich, eine Nummer auszuwählen, die für den (vermutlich nicht technisch orientierten) Benutzer sinnvoll ist. Ich mag 50, 100, 250, 500, sogar 1000. Angesichts dieser Basis von 8000 + Bytes Speicher ist 255 oder 256 genauso effizient wie 200 oder 250, und weniger effizient, wenn es darum geht, Dinge zu erklären Endnutzer.
Dies gilt für Ein-Byte-Daten (d. H. Ansii, SQL _ Latin1 * _ * General_CP1, et al.). Wenn Sie Daten für mehrere Codepages oder Sprachen mit unterschiedlichen Alphabeten speichern müssen, müssen Sie mit dem Datentyp nvarchar arbeiten (der meiner Meinung nach gleich funktioniert, zwei Bytes für die Anzahl der Zeichen, aber für jedes tatsächliche Zeichen der Daten sind zwei erforderlich Speicherbytes). Wenn Sie Strings haben, die wahrscheinlich über 8000 oder über 4000 in nvarchar gehen, müssen Sie die Datentypen [n] varchar (max) verwenden.
Und wenn Sie wissen wollen, warum es so wichtig ist der Raum mit zusätzlichem Bytes zu nehmen, nur um zu verfolgen, wie lange die Daten Besuche http://www.joelonsoftware.com/articles/fog0000000319.html
Philip
Wäre das nicht 1 Byte pro Zeichen für Varchar bedeuten, dass 255 im Vergleich zu 256 immer noch ein Byte für den Terminator hinzufügen wird, egal was? Also nimmt 256 Sie wirklich nichts über? –
@nemo I bedeutet die Information, die die Länge der Zeichenfolge ist ... * NOT * etwas mit der Zeichenfolge selbst zu tun ... Null-terminiert oder nicht, ist nicht der Punkt. Tut mir leid, wenn ich nicht klar war. – chakrit
Tut mir leid, dass ich falsch geschrieben habe, aber intern zwingt 256 gegen 255 Sie über etwas? Ich meine, ich könnte verstehen, wenn ein Char Bit war und die Länge war ein bisschen so 256 Bits + Länge würde Sie in das nächste Byte schieben, aber ich verstehe nicht, was 256 Byte + 1 Byte kostet Sie neben 1 Byte mehr? –