403 votes

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

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 ?

2 votes

Cela dépend de ce dont vous avez besoin, indexation, unicité ?

2 votes

Je m'attendais à une réponse assez simple ici, mais j'ai été assez surpris par les réponses couvrant des éléments auxquels je n'avais pas pensé. Une lecture très intéressante que j'ai ajoutée à mon compte éducatif.

1 votes

Va juste avec le TEXT tapez 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é, optez pour VARCHAR puisque TEXT ne peut pas être indexé que facilement .

372voto

micahwittman Points 6943
  1. Plus petit dénominateur commun de la longueur maximale des URL parmi les navigateurs web populaires : 2,083 (Internet Explorer)

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

  3. Alors...
    < Utilisation de MySQL 5.0.3 TEXTE
    ou
    >= MySQL 5.0.3 utiliser VARCHAR(2083)

18 votes

Bonne réponse, mais personnellement, je limiterais la longueur. En fonction du projet, vous pouvez aussi limiter les urls acceptées. Qui utilise des urls de plus de 200 caractères ?

2 votes

Ils feraient mieux d'inventer un type de données uri qui "comprend" la structure de l'uri afin que l'indexation et la recherche se fassent efficacement, comme l'a fait oracle... attendez, mysql est maintenant oracle... download.oracle.com/docs/cd/B10464_05/web.904/b12099/…

94 votes

Cette réponse est un peu trompeuse. Notez que l'expression "plus petit dénominateur commun" n'a pas de sens. le plus haut nombre qu'un navigateur ou un serveur acceptera (qui n'est pas constant et qui est susceptible de changer). Comme le dit votre lien : " ...la spécification du protocole HTTP ne précise pas de longueur maximale... ", alors ne vous embêtez pas avec ça VARCHAR(2083) il suffit d'utiliser TEXT .

40voto

Daniel Spiewak Points 30706

VARCHAR(512) (ou similaire) devrait être suffisant. Cependant, comme vous ne connaissez pas vraiment la longueur maximale des URL en question, je pourrais simplement aller directement à TEXT . Le danger de cette méthode est bien sûr la perte d'efficacité due à CLOB étant bien plus lent qu'un simple type de données de type chaîne de caractères comme VARCHAR .

0 votes

Qu'en est-il de la collation ?

18voto

Bob Probst Points 4502

varchar(max) pour SQLServer2005

varchar(65535) pour MySQL 5.0.3 et ultérieur

Cela allouera le stockage selon les besoins et ne devrait pas affecter les performances.

2 votes

Dans votre extrait, est-ce que max un spécificateur SQL ANSI magique pour augmenter la taille du VARCHAR si nécessaire, ou est-ce juste une méta-variable pour le bien de l'exemple ?

4 votes

Dans MySQL, il est fort probable que vous ne puissiez pas avoir une variable de cette taille, à moins qu'il ne s'agisse de la seule colonne de la table.

1 votes

@Daniel Spiewak : "La différence fondamentale entre TEXT et VARCHAR(MAX) est qu'un type TEXT stockera toujours les données dans un blob, alors que le type VARCHAR(MAX) tentera de stocker les données directement dans la ligne, à moins qu'elles ne dépassent la limite de 8k, auquel cas elles seront stockées dans un blob." stackoverflow.com/questions/834788/ Mais la question portait sur MySQL, donc ce n'est pas vraiment pertinent ici.

12voto

mrgrieves Points 119

Vous voudrez choisir entre une colonne TEXT ou VARCHAR en fonction des critères suivants la fréquence d'utilisation de l'URL et si vous en fait ont besoin de la longueur pour ne pas être liés.

Utilisez VARCHAR avec une longueur maximale >= 2,083 como micahwittman suggéré si :

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

Utilisez TEXTE si :

  1. L'URL risque de ne pas respecter la limite de 65 535 octets par ligne.
  2. Vos requêtes ne sélectionneront ou ne mettront pas à jour un grand nombre d'URL en même temps (ou très souvent). En effet, les colonnes TEXT ne contiennent qu'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.

5voto

carson Points 3852

La plupart des navigateurs vous permettent de mettre de très grandes quantités de données dans une URL et donc beaucoup de choses finissent par créer des URL très grandes. Si vous parlez de quelque chose de plus que la partie domaine d'une URL, vous devrez utiliser une colonne TEXTE puisque la colonne VARCHAR/CHAR sont limités .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X