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?
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 .
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.
Also ...
<MySQL 5.0.3 benutze TEXT
oder
> = MySQL 5.0.3 benutze VARCHAR (2083)
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.
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:
Sie verwenden viele URLs pro Abfrage (im Gegensatz zu TEXT-Spalten werden VARCHARs in der Zeile gespeichert).
Sie sind sich ziemlich sicher, dass eine URL niemals das Zeilenlimit von 65.535 Bytes überschreitet.
Verwenden Sie TEXT, wenn:
Die URL könnte tatsächlich das Zeilenlimit von 65.535 Byte überschreiten
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.
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'NOTNULL
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.
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
4
In den meisten Browsern können Sie sehr große Datenmengen in eine URL einfügen, sodass viele Dinge zu sehr großen URLs führen. Wenn Sie also über mehr als den Domain-Teil einer URL sprechen, müssen Sie seit dem eine TEXT-Spalte verwenden VARCHAR / CHAR sind begrenzt .
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.
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
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.
TEXT
Typ 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ürVARCHAR
, daTEXT
dies nicht so einfach indiziert werden kann .Antworten:
quelle
VARCHAR(2083)
, verwenden Sie einfachTEXT
.VARCHAR(512)
(oder ähnlich) sollte ausreichen. Da Sie jedoch die maximale Länge der betreffenden URLs nicht genau kennen, gehe ich möglicherweise direkt zuTEXT
. Die Gefahr dabei ist natürlich ein Effizienzverlust, daCLOB
s viel langsamer ist als ein einfacher String-Datentyp wieVARCHAR
.quelle
varchar(max)
für SQLServer2005varchar(65535)
für MySQL 5.0.3 und höherDadurch wird Speicher nach Bedarf zugewiesen und die Leistung sollte nicht beeinträchtigt werden.
quelle
max
einen magischen ANSI-SQL-Spezifizierer, um die VARCHAR-Größe nach Bedarf zu erhöhen, oder handelt es sich beispielsweise nur um eine Metavariable?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:
Verwenden Sie TEXT, wenn:
quelle
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.
quelle
Dies hängt wirklich von Ihrem Anwendungsfall ab (siehe unten), aber das Speichern
TEXT
hat Leistungsprobleme undVARCHAR
klingt in den meisten Fällen nach Overkill.Mein Ansatz: Verwenden Sie eine großzügige, aber nicht unangemessen große
VARCHAR
Länge wie z. B.VARCHAR(500)
und ermutigen Sie die Benutzer, die eine größere URL benötigen, einen URL-Shortener wie zsafe.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/1235702
würde als angezeigtstackoverflow.com/q/21956...
und würde auf eine verkürzte URL verlinkenhttp://ex.ampl/e1234
)Hinweise und Vorsichtsmaßnahmen
quelle
In den meisten Browsern können Sie sehr große Datenmengen in eine URL einfügen, sodass viele Dinge zu sehr großen URLs führen. Wenn Sie also über mehr als den Domain-Teil einer URL sprechen, müssen Sie seit dem eine TEXT-Spalte verwenden VARCHAR / CHAR sind begrenzt .
quelle
Ich weiß nichts über andere Browser, aber IE7 hat eine Beschränkung von 2083 Zeichen für HTTP-GET-Operationen . Sofern keine anderen Browser niedrigere Grenzwerte haben, verstehe ich nicht, warum Sie mehr Zeichen als 2083 benötigen würden.
quelle
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.
quelle
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.Weitere Informationen zur Verwendung von Datentypen mit großem Wert finden Sie in diesem TechNet- Artikel
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, dassvarchar (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.