Meilleur champ de base de données pour un type d'URL
J'ai besoin de stocker une url dans une table MySQL. Quelle est la meilleure pratique pour la définition d'un champ contenant une URL avec une durée indéterminée?
- Cela dépend de ce que vous avez besoin, d'indexation, de l'unicité ?
- Je m'attendais à un assez simple de répondre ici, mais a été assez surpris par les réponses couvrant des éléments que je n'avais pas considéré comme. Très intéressant à lire que j'ai ajoutés à mon compte d'enseignement.
- Juste aller avec le
TEXT
type et de sauter la lecture de toutes les réponses ci-dessous. En fin de compte, qu'est ce que la plupart d'entre elles suggèrent. 🙂 Bien sûr, si Vous avez besoin d'indexation ou de l'unicité, aller pourVARCHAR
, depuisTEXT
ne peuvent pas être indexées facilement.
Vous devez vous connecter pour publier un commentaire.
VARCHAR(2083)
, il suffit d'utiliserTEXT
.MySQL 5.6.31
, et je voudrais faire le url champ comme clé unique, le serveur dit max longueur de clé est de 767 octets j'ai Donc décidé de régler sa longueur à 767 en plus j'ai besoin également de définir le caractère ascii. La finale de sql ressembler à ceci:CREATE TABLE pages (id INT AUTO_INCREMENT NOT NULL, url VARCHAR(767) NOT NULL, UNIQUE INDEX UNIQ_2074E575F47645AE (url), PRIMARY KEY(id)) DEFAULT CHARACTER SET ascii COLLATE ascii_general_ci ENGINE = InnoDB
[Display(Name = "My URL")] [Column(TypeName = "VARCHAR")] [StringLength(2083)] public string MyUrl { get; set; }
VARCHAR(512)
(ou similaire) devrait être suffisant. Cependant, puisque vous ne savez pas vraiment la longueur maximale de l'Url en question, je pourrais juste aller directement àTEXT
. Le danger avec ce qui est bien sûr la perte d'efficacité due àCLOB
s étant beaucoup plus lent que d'une simple chaîne de caractères type de données commeVARCHAR
.varchar(max)
pour SQLServer2005varchar(65535)
pour MySQL 5.0.3 et plus tardCe sera une allocation de stockage en tant que de besoin et ne devrait pas affecter les performances.
max
une magie ANSI SQL spécificateur de croître VARCHAR taille que nécessaire, ou est-ce juste une méta-variable pour le bien de l'exemple?Vous aurez envie de choisir entre un TEXTE ou une colonne de type VARCHAR basé sur combien de fois l'URL sera utilisée et si vous fait besoin de la durée pour être indépendant.
Utilisation VARCHAR avec maxlength >= de 2 083 comme micahwittman suggéré si:
Utilisation TEXTE si :
Vous devez utiliser un VARCHAR avec un caractère ASCII codage. Url pour cent sont codées et internationales des noms de domaine de l'utilisation punycode donc ASCII est assez pour les stocker. Cela permettra d'utiliser beaucoup moins d'espace que l'UTF8.
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 à créer de très grandes Url donc, si vous parlez de quelque chose de plus que le domaine d'une URL que vous aurez besoin d'utiliser une colonne de TEXTE depuis le VARCHAR/CHAR sont limitées.
Cela dépend vraiment de vos cas d'utilisation (voir ci-dessous), mais le stocker comme
TEXT
a des problèmes de performances, et un énormeVARCHAR
sonne comme overkill pour la plupart des cas.Mon approche: utiliser un généreux, mais pas excessivement large
VARCHAR
longueur, commeVARCHAR(500)
, et d'encourager les utilisateurs qui ont besoin d'un plus gros URL à utiliser un raccourcisseur d'URL commesafe.mn
.Le Twitter approche: Pour un très beau UX, automatique raccourcisseur d'URL pour trop longtemps URL et de stocker la "version" de la liaison que d'un extrait de l'URL avec des points de suspension à la fin. (Exemple:
http://stackoverflow.com/q/219569/1235702
sera affiché commestackoverflow.com/q/21956...
et aurait un lien vers une URL raccourciehttp://ex.ampl/e1234
)Notes et Avertissements
Je ne sais pas pour les autres navigateurs, mais IE7 a un 2083 limite de caractères pour HTTP GET opérations. À moins que tout les autres navigateurs ont des limites plus basses, je ne vois pas pourquoi vous auriez besoin de plus de caractères que 2083.
La plupart des serveurs web ont un URL limite de longueur (c'est pourquoi il y a un code d'erreur pour "URI too long"), ce qui signifie qu'il est une pratique de taille supérieure. Trouver la valeur par défaut limite de longueur pour le plus populaire des serveurs web, et d'utiliser le plus grand d'entre eux comme le champ taille maximale; il devrait être plus que suffisant.
Vous feriez mieux d'utiliser varchar(max) qui (en termes de taille) signifie
varchar (65535)
.Ce sera même stocker vos gros adresses web et permettra d'économiser votre espace.
Voir cet article sur TechNet sur l'utilisation de l'Aide de Données de Grande Valeur Types
varchar (max)
est SQLServer syntaxe, ne convient pas pour MySQL (comme dans la question d'origine). En outre, il n'a pas les moyensvarchar (65535)
depuis 65535 est le nombre maximum de caractères ASCII en une ligne dans mysql, il est dépendant aussi sur les autres champs et sur le jeu de caractères.