Sie sehen häufig Datenbankfelder mit einer Größe von 255 Zeichen. Was ist der traditionelle / historische Grund dafür? Ich nehme an, es hat etwas mit Paging- / Speicherbeschränkungen und Leistung zu tun, aber die Unterscheidung zwischen 255 und 256 hat mich immer verwirrt.
varchar(255)
Wenn man bedenkt, dass dies eine Kapazität oder Größe ist, kein Indexer , warum wird 255 gegenüber 256 bevorzugt? Ist ein Byte für einen bestimmten Zweck reserviert (Terminator oder Null oder so)?
Vermutlich ist varchar (0) ein Unsinn (hat keine Kapazität)? In welchem Fall sollten 2 ^ 8 des Raums sicher 256 sein?
Gibt es andere Größen, die Leistungsvorteile bieten? Ist beispielsweise varchar (512) weniger leistungsfähig als varchar (511) oder varchar (510)?
Ist dieser Wert für alle alten und neuen Beziehungsdatenbanken gleich?
Haftungsausschluss - Ich bin ein Entwickler, kein DBA. Ich verwende Feldgrößen und -typen, die meiner Geschäftslogik entsprechen , sofern dies bekannt ist. Ich möchte jedoch den historischen Grund für diese Präferenz kennen, auch wenn sie nicht mehr relevant ist (aber sogar mehr, wenn es noch relevant ist).
Bearbeiten:
Vielen Dank für die Antworten, es scheint eine gewisse Übereinstimmung zu geben, dass ein Byte zum Speichern der Größe verwendet wird, aber dies regelt die Angelegenheit in meinem Kopf nicht endgültig.
Wenn die Metadaten (Zeichenfolgenlänge) im selben zusammenhängenden Speicher / Datenträger gespeichert sind, ist dies sinnvoll. 1 Byte Metadaten und 255 Byte Zeichenfolgendaten würden sehr gut zueinander passen und in 256 zusammenhängende Speicherbytes passen, was vermutlich ordentlich und ordentlich ist.
Aber ... Wenn die Metadaten (Zeichenfolgenlänge) getrennt von den tatsächlichen Zeichenfolgendaten gespeichert werden (möglicherweise in einer Mastertabelle), müssen Sie die Länge der Zeichenfolgendaten um ein Byte beschränken, nur weil es einfacher ist, nur eine Ganzzahl von 1 Byte zu speichern von Metadaten scheint ein bisschen seltsam.
In beiden Fällen scheint es eine Subtilität zu sein, die wahrscheinlich von der DB-Implementierung abhängt. Die Praxis, 255 zu verwenden, scheint ziemlich weit verbreitet zu sein, also muss irgendwo jemand am Anfang einen guten Fall dafür argumentiert haben. Kann sich jemand daran erinnern, was dieser Fall war / ist? Programmierer werden keine neue Praxis ohne Grund anwenden, und dies muss einmal neu gewesen sein.
quelle
Antworten:
Mit einer maximalen Länge von 255 Zeichen kann das DBMS ein einzelnes Byte verwenden, um die Länge der Daten im Feld anzugeben. Wenn das Limit 256 oder mehr wäre, würden zwei Bytes benötigt.
Ein Wert der Länge Null ist sicherlich für
varchar
Daten gültig (sofern nicht anders eingeschränkt). Die meisten Systeme behandeln eine solche leere Zeichenfolge als von NULL verschieden, aber einige Systeme (insbesondere Oracle) behandeln eine leere Zeichenfolge identisch mit NULL. Bei Systemen, bei denen eine leere Zeichenfolge nicht NULL ist, wird irgendwo in der Zeile ein zusätzliches Bit benötigt, um anzugeben, ob der Wert als NULL betrachtet werden soll oder nicht.Wie Sie bemerken, handelt es sich hierbei um eine historische Optimierung, die für die meisten heutigen Systeme wahrscheinlich nicht relevant ist.
quelle
varchar(0)
. Es ist wahrscheinlich nicht so nützlich, weil der Wert nur zwei Dinge sein kann, die leere Zeichenfolge oder NULL, und deshalb können Sie auch einfach einebit
dafür verwenden.255 war das Varchar-Limit in mySQL4 und früher.
Auch 255 Zeichen + Nullterminator = 256
Oder ein 1-Byte-Längen-Deskriptor gibt einen möglichen Bereich von 0 bis 255 Zeichen an
quelle
char foo[256]
ist wichtig, da die Speicherverwaltung Potenzen von 2 mag. Siehe: stackoverflow.com/questions/3190146/… Durch das Zuweisenchar foo[257]
wird entweder der Speicher fragmentiert oder es werden 512 Byte belegt.255 ist der größte numerische Wert, der in einer vorzeichenlosen Einzelbyte-Ganzzahl gespeichert werden kann (unter der Annahme von 8-Bit-Bytes). Daher würden Anwendungen, die die Länge einer Zeichenfolge für einen bestimmten Zweck speichern, 255 gegenüber 256 bevorzugen, da dies bedeutet, dass dies nur erforderlich ist Ordnen Sie der Variablen "size" 1 Byte zu.
quelle
Aus dem MySQL-Handbuch:
Verstehe und treffe die Wahl.
quelle
M represents the declared column length in characters for nonbinary string types and bytes for binary string types. L represents the actual length in bytes of a given string value.
dev.mysql.com/doc/refman/5.7/en/storage-requirements.html255 ist der Maximalwert einer 8-Bit-Ganzzahl: 11111111 = 255.
quelle
Bei einer maximalen Länge von 255 kann das Datenbankmodul nur 1 Byte zum Speichern der Länge jedes Felds verwenden. Sie haben Recht, dass Sie mit 1 Byte Speicherplatz 2 ^ 8 = 256 verschiedene Werte für die Länge der Zeichenfolge speichern können.
Wenn Sie jedoch zulassen, dass das Feld Textzeichenfolgen mit der Länge Null speichert, müssen Sie in der Lage sein, Null in der Länge zu speichern. Sie können also 256 verschiedene Längenwerte zulassen, beginnend bei Null: 0-255.
quelle
Oft werden Varchare als Pascal-Strings implementiert: Halten der tatsächlichen Länge im Byte # 0. Die Länge wurde daher an 255 gebunden. (Der Wert eines Bytes variiert von 0 bis 255.)
quelle
<<
Unter Berücksichtigung der Grundlagen des Bits / Bytes-Speichers ist ein Byte zum Speichern von Ganzzahlen unter 256 und zwei Bytes für jede Ganzzahl zwischen 256 und 65536 erforderlich. Daher ist zum Speichern von 511 oder 512 oder für 65535 derselbe Speicherplatz (zwei Bytes) erforderlich .... Somit ist es klar, dass dieses in der obigen Diskussion erwähnte Argument N / A für varchar (512) oder varchar (511) ist.
quelle
8 Bits ohne Vorzeichen = 256 Bytes
255 Zeichen + Byte 0 für die Länge
quelle
Früher war für alle Zeichenfolgen ein NUL-Terminator oder "Backslash-Zero" erforderlich. Aktualisierte Datenbanken haben das nicht. Es waren "255 Zeichen Text" mit einem "\ 0", das am Ende automatisch hinzugefügt wurde, damit das System wusste, wo die Zeichenfolge endete. Wenn Sie VARCHAR (256) sagen würden, wäre es 257 und dann wären Sie im nächsten Register für ein Zeichen. Verschwenderisch. Deshalb war alles VARCHAR (255) und VARCHAR (31). Aus Gewohnheit scheinen die 255 herumgeklebt zu sein, aber die 31er wurden 32er und die 511er wurden 512er. Dieser Teil ist komisch. Es ist schwer, mich dazu zu bringen, VARCHAR (256) zu schreiben.
quelle
Ich denke, das könnte Ihre Frage beantworten. Es sieht so aus, als ob es in früheren Systemen die maximale Grenze für Varchar war. Ich habe es von einer anderen Frage zum Stapelüberlauf genommen.
Gibt es Nachteile bei der Verwendung eines generischen Varchars (255) für alle textbasierten Felder?
quelle
Die Daten werden im Binärsystem gespeichert und 0 und 1 sind Binärziffern. Die größte Binärzahl, die in 1 Byte (8 Bit) passen kann, ist 11111111, die in eine Dezimalzahl von 255 konvertiert wird.
quelle