Bester Datenbankfeldtyp für eine URL

352

Ich muss eine URL in einer MySQL-Tabelle speichern. Was ist die beste Vorgehensweise zum Definieren eines Felds, das eine URL mit einer unbestimmten Länge enthält?

Jesse Hattabaugh
quelle
1
Es kommt darauf an, was Sie brauchen, Indizierung, Einheitlichkeit?
Thomas Decaux
2
Ich hatte hier eine ziemlich einfache Antwort erwartet, war aber ziemlich überrascht über die Antworten auf Punkte, die ich nicht berücksichtigt hatte. Sehr interessante Lektüre, die ich meinem Bildungskonto hinzugefügt habe.
HPWD
1
Gehen Sie einfach mit dem TEXTTyp und überspringen Sie das Lesen all dieser Antworten unten. Am Ende schlagen die meisten von ihnen dies vor. :) Wenn Sie eine Indizierung oder Eindeutigkeit benötigen, entscheiden Sie sich natürlich für VARCHAR, da TEXTdies nicht so einfach indiziert werden kann .
Aleksandar

Antworten:

324
  1. Niedrigste gemeinsame Nenner maximale URL-Länge unter gängigen Webbrowsern: 2.083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html
    Werte in VARCHAR-Spalten sind Zeichenfolgen variabler Länge. Die Länge kann als Wert zwischen 0 und 255 vor MySQL 5.0.3 und zwischen 0 und 65.535 in Version 5.0.3 und höher angegeben werden. Die effektive maximale Länge eines VARCHAR in MySQL 5.0.3 und höher hängt von der maximalen Zeilengröße (65.535 Byte, die von allen Spalten gemeinsam genutzt wird) und dem verwendeten Zeichensatz ab.

  3. Also ...
    <MySQL 5.0.3 benutze TEXT
    oder
    > = MySQL 5.0.3 benutze VARCHAR (2083)

Micahwittman
quelle
14
Gute Antwort, aber persönlich würde ich die Länge begrenzen. Je nach Projekt möchten Sie möglicherweise die akzeptierten URLs einschränken. Wer verwendet URL Longet als 200?
John
2
Sie sollten sich einen Uri-Datentyp einfallen lassen, der die Struktur von Uri "versteht", damit die Indizierung und Suche effizient durchgeführt wird, wie es Orakel getan hat ... Warten Sie, MySQL ist jetzt Orakels ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben
80
Diese Antwort ist etwas irreführend. Beachten Sie, dass "Kleinster gemeinsamer Nenner" hier bedeutungslos ist. Sie möchten die höchste Zahl verwenden, die ein Browser oder Server akzeptiert (was nicht konsistent ist und Änderungen unterworfen ist). Wie Ihr Link sagt: " ... die Spezifikation des HTTP-Protokolls gibt keine maximale Länge an ... ", also kümmern Sie sich nicht darum VARCHAR(2083), verwenden Sie einfach TEXT.
Wesley Murch
4
Beispiel, auch von Ihrem Link: " Nach 65.536 Zeichen zeigt die Positionsleiste die URL in Windows Firefox 1.5.x nicht mehr an. Längere URLs funktionieren jedoch. Ich habe den Test nach 100.000 Zeichen abgebrochen. "
Wesley Murch
1
Die Ressource boutell.com fiel aus dem Netz. Hier ist ein Verweis darauf in einem gescannten O'Reilly-Buch: books.google.ca/…
micahwittman
33

VARCHAR(512)(oder ähnlich) sollte ausreichen. Da Sie jedoch die maximale Länge der betreffenden URLs nicht genau kennen, gehe ich möglicherweise direkt zu TEXT. Die Gefahr dabei ist natürlich ein Effizienzverlust, da CLOBs viel langsamer ist als ein einfacher String-Datentyp wie VARCHAR.

Daniel Spiewak
quelle
Was ist mit der Zusammenstellung?
kommradHomer
16

varchar(max) für SQLServer2005

varchar(65535) für MySQL 5.0.3 und höher

Dadurch wird Speicher nach Bedarf zugewiesen und die Leistung sollte nicht beeinträchtigt werden.

Bob Probst
quelle
1
Handelt es sich in Ihrem Snippet um maxeinen magischen ANSI-SQL-Spezifizierer, um die VARCHAR-Größe nach Bedarf zu erhöhen, oder handelt es sich beispielsweise nur um eine Metavariable?
Daniel Spiewak
4
In MySQL können Sie höchstwahrscheinlich keinen so großen Varchar haben, es sei denn, dies ist die einzige Spalte in der Tabelle.
Carson
1
@ Daniel Spiewak: "Der grundlegende Unterschied zwischen TEXT und VARCHAR (MAX) besteht darin, dass ein TEXT-Typ die Daten immer in einem Blob speichert, während der VARCHAR (MAX) -Typ versucht, die Daten direkt in der Zeile zu speichern, es sei denn, er überschreitet die 8 KB Einschränkung und an diesem Punkt speichert es es in einem Blob. " stackoverflow.com/questions/834788/… Aber die Frage betraf MySQL, daher ist dies hier nicht wirklich relevant.
Stijn Bollen
9

Sie sollten zwischen einer TEXT- oder einer VARCHAR-Spalte wählen, je nachdem, wie oft die URL verwendet wird und ob Sie sie tatsächlich verwenden die Länge müssen ungebunden sein.

Verwenden Sie VARCHAR mit einer maximalen Länge> = 2.083, wie von micahwittman vorgeschlagen, wenn:

  1. Sie verwenden viele URLs pro Abfrage (im Gegensatz zu TEXT-Spalten werden VARCHARs in der Zeile gespeichert).
  2. Sie sind sich ziemlich sicher, dass eine URL niemals das Zeilenlimit von 65.535 Bytes überschreitet.

Verwenden Sie TEXT, wenn:

  1. Die URL könnte tatsächlich das Zeilenlimit von 65.535 Byte überschreiten
  2. Ihre Abfragen werden nicht mehrere URLs gleichzeitig (oder sehr oft) auswählen oder aktualisieren. Dies liegt daran, dass TEXT-Spalten nur einen Zeiger inline enthalten und die zufälligen Zugriffe beim Abrufen der referenzierten Daten schmerzhaft sein können.
mrgrieves
quelle
9

Sie sollten ein VARCHAR mit einer ASCII-Zeichencodierung verwenden. URLs sind prozentual codiert und internationale Domainnamen verwenden Punycode, sodass ASCII ausreicht, um sie zu speichern. Dies benötigt viel weniger Speicherplatz als UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Flavio Tordini
quelle
5
Benutzt UTF-8 nicht mehr Speicherplatz, wenn es nur muss?
kommradHomer
7

Dies hängt wirklich von Ihrem Anwendungsfall ab (siehe unten), aber das Speichern TEXThat Leistungsprobleme und VARCHARklingt in den meisten Fällen nach Overkill.

Mein Ansatz: Verwenden Sie eine großzügige, aber nicht unangemessen große VARCHARLänge wie z. B. VARCHAR(500)und ermutigen Sie die Benutzer, die eine größere URL benötigen, einen URL-Shortener wie z safe.mn.

Der Twitter-Ansatz: Stellen Sie für eine wirklich schöne UX einen automatischen URL-Shortener für zu lange URLs bereit und speichern Sie die "Anzeigeversion" des Links als Ausschnitt der URL mit Ellipsen am Ende. (Beispiel: http://stackoverflow.com/q/219569/1235702würde als angezeigt stackoverflow.com/q/21956...und würde auf eine verkürzte URL verlinken http://ex.ampl/e1234)

Hinweise und Vorsichtsmaßnahmen

  • Natürlich ist der Twitter-Ansatz besser, aber für die Anforderungen meiner App war es ausreichend, einen URL-Shortener zu empfehlen.
  • URL-Shortener haben ihre Nachteile, wie z. B. Sicherheitsbedenken. In meinem Fall ist dies kein großes Risiko, da die URLs nicht öffentlich sind und nicht häufig verwendet werden. Dies wird jedoch offensichtlich nicht für alle funktionieren. safe.mn scheint viele Spam- und Phishing-URLs zu blockieren, aber ich würde trotzdem Vorsicht empfehlen.
  • Beachten Sie unbedingt, dass Sie Ihre Benutzer nicht zwingen sollten, einen URL-Shortener zu verwenden. In den meisten Fällen (zumindest für die Anforderungen meiner App) reichen 500 Zeichen für das aus, wofür die meisten Benutzer sie verwenden. Verwenden / empfehlen Sie einen URL-Shortener nur für zu lange Links.
brokethebuildagain wieder
quelle
10
Wenn Sie einen integrierten URL-Shortener bereitstellen, müssen Sie die URL in voller Länge dann nicht noch irgendwo in einer Datenbank speichern, damit sie funktioniert? :-)
Neil Neyman
2
Na sicher; aber ich bezweifle, dass die meisten Leute ihren eigenen Shortener schreiben würden. Seit ich dies geschrieben habe, habe ich erfahren, dass es viele APIs zur URL-Verkürzung gibt (71 sind hier aufgelistet: programmableweb.com/news/… ), sodass Sie den Prozess automatisieren können, ohne Ihre eigenen zu schreiben. Dies hängt natürlich immer noch von den Kenntnissen und der Zustimmung der Benutzer ab.
Brokethebuildagain
1

Die meisten Webserver haben eine URL-Längenbeschränkung (weshalb es einen Fehlercode für "URI zu lang" gibt), was bedeutet, dass es eine praktische obere Größe gibt. Suchen Sie die Standardlängenbeschränkung für die beliebtesten Webserver und verwenden Sie die größte davon als maximale Größe des Felds. es sollte mehr als genug sein.

CesarB
quelle
1

Verwenden Sie besser varchar (max), was (in Bezug auf die Größe) bedeutet varchar (65535). Dadurch werden sogar Ihre größeren Webadressen gespeichert und Platz gespart.

Der Max-Bezeichner erweitert die Speicherfunktionen der Datentypen varchar, nvarchar und varbinary. varchar (max), nvarchar (max) und varbinary (max) werden gemeinsam als Datentypen mit großem Wert bezeichnet. Sie können die großen Datentypen verwenden, um bis zu 2 ^ 31-1 Datenbytes zu speichern.

Weitere Informationen zur Verwendung von Datentypen mit großem Wert finden Sie in diesem TechNet- Artikel

Sohaiby
quelle
varchar (max)ist die SQLServer-Syntax, die nicht für MySQL geeignet ist (wie in der ursprünglichen Frage). Darüber hinaus bedeutet dies nicht, dass varchar (65535)65535 die maximale Anzahl von ASCII-Zeichen in einer Zeile in MySQL ist, sodass es auch von den anderen Feldern und vom Zeichensatz abhängt.
Furins