web-dev-qa-db-fra.com

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 de longueur indéterminée?

326
Jesse Hattabaugh
  1. Longueur maximale maximale du dénominateur commun parmi les navigateurs Web les plus 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 avec une valeur comprise entre 0 et 255 avant MySQL 5.0.3 et entre 0 et 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 fonction de la taille maximale de la ligne (65 535 octets, qui est partagée entre toutes les colonnes) et du jeu de caractères utilisé.

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

306
micahwittman

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

31
Daniel Spiewak

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.

16
Bob Probst

Vous aurez le choix entre une colonne TEXT ou VARCHAR basée sur à quelle fréquence l'URL sera utilisée et si vous réellement avez besoin la longueur à délier.

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

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

Utilisez TEXT si:

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

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 pour que ASCII soit suffisant pour les stocker. Cela utilisera beaucoup moins d'espace que UTF8.

VARCHAR(512) CHARACTER SET 'ascii' COLLATE 'ascii_general_ci' NOT NULL
9
Flavio Tordini

Cela dépend vraiment de votre cas d'utilisation (voir ci-dessous), mais le stockage en tant que TEXT a des problèmes de performances, et un énorme VARCHAR sonne comme étant excessif dans la plupart des cas.

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

L'approche Twitter: Pour une UX vraiment agréable, fournissez un raccourcisseur automatique d'URL pour les URL trop longues et stockez la "version d'affichage" du lien sous forme d'extrait d'URL avec des ellipses à la fin. (Exemple: http://stackoverflow.com/q/219569/1235702 serait affiché sous la forme stackoverflow.com/q/21956... et créerait un lien vers une URL raccourcie http://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, le risque n'est pas énorme car les URL ne sont ni publiques ni très utilisées; Cependant, cela ne fonctionnera évidemment pas pour tout le monde. safe.mn semble bloquer beaucoup d'URL de spam et de phishing, mais je recommanderais tout de même la prudence.
  • Veillez à noter que vous ne devez pas forcer vos utilisateurs à utiliser un raccourcisseur d'URL. Dans la plupart des cas (du moins pour les besoins de mon application), 500 caractères sont excessivement suffisants pour ce que la plupart des utilisateurs vont utiliser. Utilisez/recommandez uniquement un raccourcisseur d'URL pour les liens trop longs.
4
CullenJ

La plupart des navigateurs vous permettent de mettre de très grandes quantités de données dans une URL et ainsi beaucoup de choses finissent par créer de très grandes URLs, donc si vous parlez de quelque chose de plus que la partie domaine d'une URL dont vous aurez besoin d'utiliser une colonne TEXT depuis le VARCHAR/CHAR sont limités .

4
carson

Je ne connais pas les autres navigateurs, mais IE7 a une limite de 2083 caractères pour les opérations HTTP GET . À moins que d'autres navigateurs aient des limites plus basses, je ne vois pas pourquoi vous auriez besoin de plus de caractères que 2083.

3
matt b

La plupart des serveurs Web ont une limite de longueur d'URL (c'est pourquoi il existe un code d'erreur pour "URI too long"), ce qui signifie qu'il existe une taille supérieure pratique. Recherchez 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.

1
CesarB

Vous feriez mieux d'utiliser varchar (max) qui (en termes de taille) signifie varchar (65535). Cela permettra même de stocker vos plus grandes adresses Web et permettra également d'économiser 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.

Voir cet article sur TechNet à propos de l’utilisation de types de données de grande valeur.

1
sohaiby