Meilleur type de champ de base de données pour une URL

352

J'ai besoin de stocker une URL dans une table MySQL. Quelle est la meilleure pratique pour définir un champ qui contiendra une URL d'une longueur indéterminée?

Jesse Hattabaugh
la source
1
Cela dépend de ce dont vous avez besoin, de l'indexation, de l'unicité?
Thomas Decaux
2
Je m'attendais à une réponse assez simple ici, mais j'ai été assez surpris des réponses couvrant des éléments que je n'avais pas pris en compte. Lecture très intéressante que j'ai ajoutée à mon compte éducatif.
HPWD
1
Allez simplement avec le TEXTtype et sautez la lecture de toutes ces réponses ci-dessous. En fin de compte, c'est ce que la plupart d'entre eux suggèrent. :) Bien sûr, si vous avez besoin d'indexation ou d'unicité, allez-y VARCHAR, car TEXTne peut pas être indexé aussi facilement .
Aleksandar

Réponses:

324
  1. Longueur maximale de l'URL du plus petit dénominateur commun parmi les navigateurs Web populaires: 2 083 (Internet Explorer)

  2. http://dev.mysql.com/doc/refman/5.0/en/char.html Les
    valeurs dans les colonnes VARCHAR sont des chaînes de longueur variable. La longueur peut être spécifiée sous la forme d'une valeur de 0 à 255 avant MySQL 5.0.3 et de 0 à 65 535 dans les versions 5.0.3 et ultérieures. La longueur maximale effective d'un VARCHAR dans MySQL 5.0.3 et versions ultérieures est soumise à la taille de ligne maximale (65 535 octets, partagée entre toutes les colonnes) et au jeu de caractères utilisé.

  3. Donc ...
    <MySQL 5.0.3 utilise TEXT
    ou
    > = MySQL 5.0.3 utilise VARCHAR (2083)

micahwittman
la source
14
Bonne réponse, mais personnellement je limiterais la longueur. Selon le projet, vous souhaiterez peut-être limiter les URL acceptées. Qui utilise l'URL longet 200?
John
2
Ils feraient mieux de trouver un type de données uri qui "comprenne" la structure de l'uri afin que l'indexation et la recherche se fassent efficacement, comme le faisait oracle ... attendez, mysql est maintenant oracle ... download.oracle.com/docs/ cd / B10464_05 / web.904 / b12099 /…
redben
80
Cette réponse est un peu trompeuse. Notez que le "plus petit dénominateur commun" n'a ici aucun sens, vous souhaitez utiliser le nombre le plus élevé qu'un navigateur ou un serveur acceptera (ce qui n'est pas cohérent et susceptible de changer). Comme le dit votre lien: " ... la spécification du protocole HTTP ne spécifie aucune longueur maximale ... ", alors ne vous embêtez pas avec cela VARCHAR(2083), utilisez simplement TEXT.
Wesley Murch
4
Exemple, également à partir de votre lien: " Après 65 536 caractères, la barre d'emplacement n'affiche plus l'URL dans Windows Firefox 1.5.x. Cependant, les URL plus longues fonctionneront. J'ai arrêté de tester après 100 000 caractères. "
Wesley Murch
1
La ressource boutell.com est tombée du net. En voici une référence dans un livre numérisé d'O'Reilly: books.google.ca/…
micahwittman
33

VARCHAR(512)(ou similaire) devrait être suffisant. Cependant, comme vous ne connaissez pas vraiment la longueur maximale des URL en question, je pourrais aller directement à TEXT. Le danger avec ceci est bien sûr la perte d'efficacité due au fait que CLOBs est beaucoup plus lent qu'un simple type de données de type chaîne VARCHAR.

Daniel Spiewak
la source
qu'en est-il de la collation?
kommradHomer
16

varchar(max) pour SQLServer2005

varchar(65535) pour MySQL 5.0.3 et versions ultérieures

Cela allouera du stockage en fonction des besoins et ne devrait pas affecter les performances.

Bob Probst
la source
1
Dans votre extrait de code, est-ce maxun spécificateur SQL ANSI magique pour augmenter la taille VARCHAR selon les besoins, ou s'agit-il simplement d'une méta-variable à titre d'exemple?
Daniel Spiewak
4
Dans MySQL, vous ne pouvez probablement pas avoir un varchar de cette taille à moins qu'il ne soit la seule colonne de la table.
carson
1
@Daniel Spiewak: "La différence fondamentale entre TEXT et VARCHAR (MAX) est qu'un type TEXT stockera toujours les données dans un blob tandis que le type VARCHAR (MAX) tentera de stocker les données directement dans la ligne à moins qu'il ne dépasse les 8k limitation et à ce stade, il le stocke dans un blob. " stackoverflow.com/questions/834788/… Mais la question concernait MySQL, donc ce n'est pas vraiment pertinent ici.
Stijn Bollen
9

Vous voudrez choisir entre une colonne TEXT ou VARCHAR en fonction de la fréquence à laquelle l'URL sera utilisée et si vous avez réellement besoin que la longueur soit non liée.

Utilisez VARCHAR avec maxlength> = 2083 comme micahwittman suggéré si:

  1. Vous utiliserez beaucoup d'URL par requête (contrairement aux colonnes TEXT, les VARCHARs sont stockés en ligne avec la ligne)
  2. Vous êtes quasiment sûr qu'une URL ne dépassera jamais la limite de ligne de 65 535 octets.

Utilisez TEXT si:

  1. L'URL pourrait vraiment dépasser la limite de ligne de 65 535 octets
  2. Vos requêtes ne sélectionneront ni ne mettront à jour un groupe d'URL à la fois (ou très souvent). En effet, les colonnes TEXT contiennent simplement un pointeur en ligne et les accès aléatoires impliqués dans la récupération des données référencées peuvent être pénibles.
mrgrieves
la source
9

Vous devez utiliser un VARCHAR avec un codage de caractères ASCII. Les URL sont codées en pourcentage et les noms de domaine internationaux utilisent punycode, donc ASCII est suffisant pour les stocker. Cela utilisera beaucoup moins d'espace que UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
Flavio Tordini
la source
5
l'UTF-8 n'utilise-t-il pas plus d'espace alors qu'il le faut?
kommradHomer
7

Cela dépend vraiment de votre cas d'utilisation (voir ci-dessous), mais le stockage, tout comme TEXTles problèmes de performances, et un énorme VARCHARbruit de surpuissance dans la plupart des cas.

Mon approche: utilisez une VARCHARlongueur généreuse, mais pas déraisonnablement grande , telle VARCHAR(500)ou telle, et encouragez les utilisateurs qui ont besoin d'une URL plus grande à utiliser un raccourcisseur d'URL tel que safe.mn.

L'approche Twitter: pour une expérience utilisateur vraiment agréable, fournissez un raccourcisseur d'URL automatique pour les URL trop longues et stockez la "version d'affichage" du lien comme un extrait de l'URL avec des ellipses à la fin. (Exemple: http://stackoverflow.com/q/219569/1235702serait affiché comme stackoverflow.com/q/21956...et serait lié à une URL raccourciehttp://ex.ampl/e1234 )

Notes et mises en garde

  • De toute évidence, l'approche Twitter est plus agréable, mais pour les besoins de mon application, recommander un raccourcisseur d'URL était suffisant.
  • Les raccourcisseurs d'URL ont leurs inconvénients, tels que des problèmes de sécurité. Dans mon cas, ce n'est pas un risque énorme car les URL ne sont pas publiques et peu utilisées; cependant, cela ne fonctionnera évidemment pas pour tout le monde. safe.mn semble bloquer un grand nombre d'URL de spam et de phishing, mais je recommanderais tout de même la prudence.
  • N'oubliez pas de ne pas forcer vos utilisateurs à utiliser un raccourcisseur d'URL. Dans la plupart des cas (au moins pour les besoins de mon application), 500 caractères sont trop suffisants pour ce que la plupart des utilisateurs l'utiliseront. N'utilisez / recommandez un raccourcisseur d'URL que pour les liens trop longs.
brokethebuildagain
la source
10
Si vous fournissez un raccourcisseur d'URL intégré, n'aurez-vous pas encore besoin de stocker l'URL complète dans une base de données quelque part pour que cela fonctionne? :-)
Neil Neyman
2
Bien sûr; mais je doute que la plupart des gens écriraient leur propre raccourcisseur. Depuis que j'ai écrit ceci, j'ai appris qu'il existe de nombreuses API de raccourcissement d'URL (71 sont répertoriées ici: programmableweb.com/news/… ), vous pouvez donc automatiser le processus sans même écrire le vôtre. Cela dépend toujours de la connaissance et du consentement des utilisateurs, bien sûr.
brokethebuildagain
1

La plupart des serveurs Web ont une limite de longueur d'URL (c'est pourquoi il existe un code d'erreur pour "URI trop long"), ce qui signifie qu'il existe une taille supérieure pratique. Trouvez la limite de longueur par défaut pour les serveurs Web les plus populaires et utilisez le plus grand d'entre eux comme taille maximale du champ; cela devrait être plus que suffisant.

CesarB
la source
1

Vous feriez mieux d'utiliser varchar (max) ce qui (en termes de taille) signifie varchar (65535). Cela stockera même vos adresses Web plus importantes et économisera également votre espace.

Le spécificateur max étend les capacités de stockage des types de données varchar, nvarchar et varbinary. varchar (max), nvarchar (max) et varbinary (max) sont collectivement appelés types de données de grande valeur. Vous pouvez utiliser les types de données de grande valeur pour stocker jusqu'à 2 ^ 31-1 octets de données.

Consultez cet article sur TechNet sur l'utilisation de types de données de grande valeur

sohaiby
la source
varchar (max)est la syntaxe SQLServer, ne convient pas à MySQL (comme dans la question d'origine). De plus, cela ne signifie pas varchar (65535)que 65535 est le nombre maximum de caractères ASCII consécutifs dans mysql, il dépend donc également des autres champs et du jeu de caractères.
furins