Warum verwenden Menschen in der Vergangenheit 255 und nicht 256 für Datenbankfeldgrößen?

188

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.

Andrew M.
quelle
3
Weil die Zeichenanzahl von 0 bis N-1 beginnt. So werden 256 Zeichen als varchar (255) deklariert. Es sei denn, ich irre mich.
Buhake Sindi
3
Vielleicht, weil IT-Leute anfangen, mit 0 zu zählen, nicht mit 1;)?
Romain Linsolas
Ich denke, es hat mit Programmierern der alten Schule zu tun, ich kann mich nicht einmal daran erinnern, warum wir es getan haben.
Mürrisch
7
@Elite Gentleman: Nein, die Zahl in Klammern ist die wahre Länge ... Wie in C-Array-Deklarationen: x [256] ergibt x [0] ... x [255].
RedPandaCurios
@romaintaz - aber betrachten Sie ein Array, das 1 Element speichern kann. Sie deklarieren etwas [1] und greifen darauf zu [0]. Die Frage ist, warum wir in SQL die Kapazität als 1 Byte weniger deklarieren, als es auf den ersten Blick logisch erscheint.
Andrew M

Antworten:

167

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 varcharDaten 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.

Greg Hewgill
quelle
Ein Byte für die Länge zu reservieren ist sinnvoll, aber WRT Ihr zweiter Absatz, vermutlich ein / Wert / der Länge Null, ist gültig, aber ist ein / Kapazität / der Länge Null gültig?
Andrew M
1
@ Andrew: Ich habe es gerade versucht und PostgreSQL lehnt ab 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 eine bitdafür verwenden.
Greg Hewgill
Es ist also richtig anzunehmen, dass die Kapazitätsmetadaten in demselben zusammenhängenden Block wie die Daten selbst gespeichert sind, und daher hat die DB den Vorteil, die Summe dieser beiden Dinge (Daten und Metadaten) auf einer Seite zu halten (vermutlich 256) Bytes)?
Andrew M
@ Andrew: Dies ist eine Annahme, die abhängig von den Implementierungsdetails des betreffenden DBMS wahr sein kann oder nicht. Seitengrößen sind normalerweise viel größer als 256 Bytes. Wie bereits erwähnt, ist diese Art der Optimierung manchmal wichtig (z. B. wenn Sie Milliarden kleiner Zeilen speichern), aber meistens lohnt es sich nicht, sich darüber Gedanken zu machen.
Greg Hewgill
3
Die Bedeutung des Speicherplatzes (und des Indexspeichers) liegt nicht darin, dass 256 in eine Seite passen, sondern darin, dass 1 Byte gegenüber 2 Byte (für Millionen / Milliarden / Billionen Zeilen) einen großen Unterschied macht.
Ypercubeᵀᴹ
35

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

RedPandaCurios
quelle
Das Einlesen char foo[256]ist wichtig, da die Speicherverwaltung Potenzen von 2 mag. Siehe: stackoverflow.com/questions/3190146/… Durch das Zuweisen char foo[257]wird entweder der Speicher fragmentiert oder es werden 512 Byte belegt.
Ebyrob
4
Speichert varchar nicht die Länge der Zeichenfolge und benötigt daher keinen Nullterminator?
Cruncher
19

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.

Bernstein
quelle
17

Aus dem MySQL-Handbuch:

Datentyp:
VARCHAR (M), VARBINARY (M)

Erforderlicher Speicher:
L + 1 Byte, wenn Spaltenwerte 0 - 255 Byte erfordern, L + 2 Byte, wenn Werte mehr als 255 Byte erfordern

Verstehe und treffe die Wahl.

Anil Shinde
quelle
Ja, aber 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.html
DLight
13

255 ist der Maximalwert einer 8-Bit-Ganzzahl: 11111111 = 255.

Remi Bourgarel
quelle
7

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.

MarkJ
quelle
6

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.)

Vlad
quelle
5

<<

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.

Balaji Katika
quelle
4

8 Bits ohne Vorzeichen = 256 Bytes

255 Zeichen + Byte 0 für die Länge

gbn
quelle
3

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.

Greg
quelle
0

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.

Es ist natürlich schwer zu wissen, wie die längste Postanschrift lautet, weshalb viele Leute eine lange VARCHAR wählen, die sicherlich länger ist als jede andere Adresse. Und 255 ist üblich, weil es in einigen Datenbanken zu Beginn der Zeit (sowie bis vor kurzem PostgreSQL) möglicherweise die maximale Länge eines VARCHAR war.

Gibt es Nachteile bei der Verwendung eines generischen Varchars (255) für alle textbasierten Felder?

Neo M Hacker
quelle
0

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.

Ejaz
quelle