Gibt es einen guten Grund, warum ich sehe, dass VARCHAR (255) so oft verwendet wird (im Gegensatz zu einer anderen Länge)?

158

In mehreren Kursen, Büchern und Jobs habe ich Textfelder, die als VARCHAR (255) definiert sind, als Standard für "kurzen" Text gesehen. Gibt es einen guten Grund, warum eine Länge von 255 so oft gewählt wird, außer eine schöne runde Zahl zu sein ? Ist es ein Überbleibsel aus einer Zeit in der Vergangenheit, als es einen guten Grund gab (ob es heute gilt oder nicht)?

Mir ist natürlich klar, dass ein engeres Limit idealer wäre, wenn Sie irgendwie die maximale Länge der Saite kennen. Wenn Sie jedoch VARCHAR (255) verwenden, bedeutet dies wahrscheinlich, dass Sie die maximale Länge nicht kennen, sondern nur, dass es sich um eine "kurze" Zeichenfolge handelt.


Hinweis: Ich habe diese Frage gefunden ( varchar (255) v tinyblob v tinytext ), die besagt, dass VARCHAR ( n ) n +1 Byte Speicher für n <= 255, n +2 Byte Speicher für n > 255 benötigt. Ist das der einzige Grund? Das scheint willkürlich zu sein, da Sie im Vergleich zu VARCHAR (256) nur zwei Bytes speichern würden, und Sie könnten genauso gut zwei weitere Bytes speichern, indem Sie es als VARCHAR (253) deklarieren.

Pennen
quelle

Antworten:

109

In der Vergangenheit waren 255 Zeichen VARCHARin einigen DBMS häufig die maximale Länge von a , und manchmal ist es immer noch das effektive Maximum, wenn Sie UTF-8 verwenden und die Spalte indizieren lassen möchten (aufgrund von Einschränkungen der Indexlänge).

Chaos
quelle
4
@ CharlesBretana: Wenn Sie den Rest des von Ihnen zitierten Satzes lesen, finden Sie die genaue Erklärung, die Sie anfordern.
Chaos
2
@CharlesBretana: Mit "gefälschter UTF-8" meine ich die "utf8" -Codierung von MySQL, die, wie bereits erwähnt, 3 Bytes pro Zeichen reserviert (und auf diese beschränkt ist). Dies ist keine sehr gute Version von UTF-8; Wenn Sie anständiges UTF-8 in MySQL wollen, müssen Sie die "utf8mb4" -Codierung verwenden. Es ist jedoch viel wahrscheinlicher, dass die Leute das nicht wissen und sich für "utf8" entscheiden, und es ist viel wahrscheinlicher, dass sie UTF-8 wollen als jede andere Codierung. Daher haben sie vorab eine maximal indizierbare Länge von 255 Zeichen in einem VARCHAR. Trotz Ihrer Erstaunen.
Chaos
3
@ CharlesBretana: Ich habe es jetzt dreimal erklärt und nichts hat sich geändert. Die Indexlängenbeschränkung von MySQL beträgt immer noch 767 Bytes, die Anzahl der zum Codieren eines 3-Byte-UTF-8-Zeichens erforderlichen Bytes beträgt immer noch 3 und die Etage (767/3) beträgt immer noch 255. Ihre Entschlossenheit, etwas zu finden, das über die Überzeugung der Bettler verwirrt ist .
Chaos
1
@CharlesBretana (Entschuldigung, dass ich zu spät zu dieser ganzen Party gekommen bin) Ich bin kein DB-Spezialist, aber ich denke, das Chaos sagt: Ja, eine 'Fake UTF-8'-Spalte kann mehr als 255 Zeichen lang sein, aber der Index wird es tun Arbeiten Sie nur mit den ersten 255 Zeichen des Varchars, sodass es effektiv das Maximum einer Spalte ist, wenn Sie möchten, dass es vollständig indiziert ist. Das ist nur das, was ich von seinen Erklärungen verstanden habe. Ich kann mich irren, ich bin überhaupt kein Experte für SQL-Indizes.
Francis Lord
2
@CharlesBretana Wenn Sie sich die Antwort von Chaos genau ansehen, werden Sie feststellen, dass sie in zwei Teile unterteilt ist: 1. Der historische Grund für Varchar (255) ist so häufig (früher war er bei einigen älteren DBMS das Maximum), 2. Selbst heute ist es für einige immer noch eine Einschränkung, da die zuvor diskutierten Indexbeschränkungen Teil 1 und 2 nicht miteinander verknüpft sind. Teil 1 ist die eigentliche Antwort auf die Frage, Teil 2 ist eine Randnotiz, die für die Frage immer noch relevant ist, weil sie erklärt, warum dies auch heute noch eine Einschränkung sein kann. (FORTSETZUNG ->)
Francis Lord
161

255 wird verwendet, weil es die größte Anzahl von Zeichen ist, die mit einer 8-Bit-Zahl gezählt werden können. Es maximiert die Verwendung der 8-Bit-Zählung, ohne leichtfertig ein weiteres ganzes Byte zu benötigen, um die Zeichen über 255 zu zählen.

Auf diese Weise verwendet VarChar nur die Anzahl der Bytes + 1, um Ihren Text zu speichern. Sie können ihn also genauso gut auf 255 setzen, es sei denn, Sie möchten eine feste Grenze (wie 50) für die Anzahl der Zeichen im Feld.

Robert Harvey
quelle
90
Ich mag diesen Satz: "leichtfertig ein weiteres ganzes Byte erfordern". =)
MusiGenesis
7
Gilt dies für DBs, in denen Varchars UTF-8 sind?
Antak
1
@antak: In MySQL darf mit InnoDB keine Schlüsselspalte größer als 767 Byte sein. Wenn eine VARCHAR-Spalte UTF8 ist (was bedeutet, dass jedes Zeichen bis zu 3 Byte dauern kann), ist die maximal zulässige Länge der Spalte Etage (767/3) = 255. Ich gehe davon aus, dass "767" genau aus diesem Grund ausgewählt wurde.
BlueRaja - Danny Pflughoeft
1
Wenn der Zeichensatz istutf8 , varchar(85)ist die Grenze, über die die Kreuzung das Längenbyte von einem auf zwei Bytes kippt. Wenn ja utf8mb4, ist es varchar(63). Diese sind von Bedeutung, da sie das Maximum darstellen, bis zu dem die Länge eines VARCHAR durch die Verwendung von Online-ALTER TABLE verlängert werden kann . Folglich habe ich diese Zahlen abgeleitet, indem ich eine Tabelle mit einer varchar(2) charset utf8Spalte erstellt und gesehen habe, wie weit ich sie gegeben haben konnte ALGORITHM=INPLACE.
Antak
Noch sinnvoller ist es, wenn man bedenkt, dass viele "Datenbanken" Back In The Day auf Magnetband gespeichert wurden. Es war sehr üblich, Daten in "Blöcken" zu lesen, die in Vielfachen von zwei dimensioniert waren. Auf diese Weise wurden Daten am effizientesten gespeichert (und wenn Sie auf einem alten Mainframe ausgeführt wurden, waren kleine Effizienzgewinne wie Make-it-or-Break-it-Optimierungen).
TMN
23

Wahrscheinlich, weil sowohl SQL Server als auch Sybase (um nur zwei zu nennen, mit denen ich vertraut bin) maximal 255 Zeichen in der Anzahl der Zeichen in einer VARCHARSpalte hatten. Für SQL Server hat sich dies in Version 7 1996/1997 oder so geändert ... aber alte Gewohnheiten sterben manchmal schwer.

Charles Bretana
quelle
8
+1 zum Zitieren bestimmter DBs und Versionen. Und "Alte Gewohnheiten sterben schwer" ist wahrscheinlich die wahrste Antwort von allen.
Andrew M
17

Ich werde die wörtliche Frage beantworten: Nein , es gibt keinen guten Grund, warum VARCHAR (255) so oft verwendet wird (es gibt tatsächlich Gründe , wie in den anderen Antworten erläutert, nur keine guten). Sie werden nicht viele Beispiele für Projekte finden, die katastrophal gescheitert sind, weil der Architekt VARCHAR (300) anstelle von VARCHAR (255) gewählt hat. Dies wäre ein Problem von nahezu völliger Bedeutungslosigkeit, selbst wenn Sie über CHAR anstelle von VARCHAR sprechen würden.

MusiGenesis
quelle
1 Byte von 255 ist 0,4%. Manchmal interessiert dich das letzte halbe Prozent oder so. Manchmal nicht. Wenn Ihre Hosting- und Perf-Kosten mehrere zehn Dollar betragen, ist es Ihnen wahrscheinlich egal. Wenn sie in die Millionen laufen, tun sie es wahrscheinlich.
Edward Brey
2
@ EdwardBrey: Wenn Moores Gesetz immer noch zutrifft, ist meine Antwort hier 16 Mal gültiger als zu dem Zeitpunkt, als ich sie geschrieben habe.
MusiGenesis
Es sei denn, wir haben 16 Mal mehr Möglichkeiten entdeckt, wie Computer uns helfen können. Geschwindigkeit ist immer noch ein Merkmal.
Edward Brey
14

Wenn Sie sagen, 2^8Sie bekommen 256, aber die Zahlen in Computerbegriffen beginnen von der Zahl 0. Dann haben Sie das 255, Sie können es in einer Internetmaske nach der IP oder in der IP selbst suchen.

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

Hilft das?

exec.-
quelle
1
Bei ganzen Zahlen zählen Sie ab 0 und enden bei 255. Bei Stellen in einer Zeichenfolge zählen Sie jedoch ab dem 1. Platz. Es ist also nicht sinnvoll, am 256. Platz zu enden, da Sie statt bei 1 begonnen haben 0? Aufgrund der Ergebnisse von string_length () stimme ich varchar (256) noch nicht vollständig zu, bin mir aber nicht sicher.
HoldOffHunger
1
@HoldOffHunger-Zeichenfolgen in einer Datenbank können eine Länge von null Zeichen haben. Der zulässige Längenbereich, wenn die Länge in acht Bits gespeichert ist, liegt also zwischen 0 und 255. Wenn Sie sagen möchten, dass alle Zeichenfolgen mindestens ein Zeichen haben müssen, müssen Sie könnte Zeichenfolgen mit 256 Zeichen und einer Länge von acht Bit unterstützen.
Phoog
7

Hinweis: Ich habe diese Frage gefunden ( varchar (255) v tinyblob v tinytext ), die besagt, dass VARCHAR ( n ) n +1 Byte Speicher für n <= 255, n +2 Byte Speicher für n > 255 benötigt. Ist das der einzige Grund? Das scheint willkürlich zu sein, da Sie im Vergleich zu VARCHAR (256) nur zwei Bytes speichern würden, und Sie könnten genauso gut zwei weitere Bytes speichern, indem Sie es als VARCHAR (253) deklarieren.

Nein. Sie speichern nicht zwei Bytes, indem Sie 253 deklarieren. Die Implementierung des varchar ist höchstwahrscheinlich ein Längenzähler und ein nicht abgeschlossenes Array mit variabler Länge. Dies bedeutet, dass Sie, wenn Sie "Hallo" in einem Varchar (255) speichern, 6 Bytes belegen: ein Byte für die Länge (die Nummer 5) und 5 Bytes für die fünf Buchstaben.

Stefano Borini
quelle
3
Diese Aussage gilt nicht für alle Datenbanken. Viele Datenbanken verwenden Varchar-Felder der angegebenen Größe in den Tabellen, damit sie keine Zeilen verschieben müssen, wenn dieses Feld für eine Zeile geändert wird.
SingleNegationElimination
ja, du hast recht. es ist implementierungsabhängig. Sie müssen das Herstellerhandbuch überprüfen, um zu sehen, was der Fall ist
Stefano Borini
2
Es mag zulässig sein, aber die Implementierung auf VARCHARdiese Weise macht den ganzen Sinn der Verwendung von VARCHARzunichte CHAR.
Dan04
4

Eine vorzeichenlose 1-Byte-Nummer kann den Bereich [0-255] einschließlich enthalten. Wenn Sie also 255 sehen, liegt das hauptsächlich daran, dass Programmierer in der Basis denken 10(verstehen Sie den Witz?) :)

Tatsächlich war 255 für eine Weile die größte Größe, die Sie einem VARCHAR in MySQL geben konnten, und die Verwendung von VARCHAR gegenüber TEXT bei der Indizierung und anderen Problemen bietet Vorteile.

gahooa
quelle
4

In vielen Anwendungen wie MsOffice (bis Version 2000 oder 2002) betrug die maximale Anzahl von Zeichen pro Zelle 255. Das Verschieben von Daten aus Programmen, die mehr als 255 Zeichen pro Feld verarbeiten können, zu / von diesen Anwendungen war ein Albtraum. Derzeit ist das Limit immer weniger hinderlich.

Joaquin Montes
quelle
2

0000 0000 -> Dies ist eine 8-Bit-Binärzahl. Eine Ziffer steht für ein bisschen.

Sie zählen so:

0000 0000 → (0)

0000 0001 → (1)

0000 0010 → (2)

0000 0011 → (3)

Jedes Bit kann einer von zwei Werten sein: Ein oder Aus. Die höchste Gesamtzahl kann durch Multiplikation dargestellt werden:

2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 - 1 = 255

Oder

2^8 - 1. 

Wir subtrahieren eins, weil die erste Zahl 0 ist.

255 kann ziemlich viele Werte enthalten (kein Wortspiel beabsichtigt).

Wenn wir mehr Bits verwenden, steigt der Maximalwert exponentiell an. Daher ist das Hinzufügen weiterer Bits für viele Zwecke übertrieben.

ScottyBlades
quelle
1

Ein weiterer Grund kann sein, dass Sie in sehr alten Datenzugriffsbibliotheken unter Windows wie RDO und ADO (COM-Version nicht ADO.NET) eine spezielle Methode, GetChunk, aufrufen mussten, um Daten aus einer Spalte mit mehr als 255 Zeichen abzurufen. Wenn Sie eine Varchar-Spalte auf 255 beschränkt haben, war dieser zusätzliche Code nicht erforderlich.

Booji Boy
quelle