Collation pour l'URL

Attention: Je connais très peu de choses sur les collations de bases de données, donc excuses à l'avance si cela est évident …

Nous avons une colonne de database qui contient des URL. Nous aimerions placer une contrainte / index unique sur cette colonne.

Il a été porté à mon attention que sous la collation par défaut db Latin1_General_CI_AS , les dupes existent dans cette colonne parce que (par exemple) l'url http://1.2.3.4:5678/someResource et http://1.2.3.4:5678/SomeResource sont considérés égal. Ce n'est souvent pas le cas … le type de server indiqué par cette URL est sensible à la casse.

Quelle serait la collation la plus appropriée pour une telle colonne? Évidemment sensibilité à la casse est un must, mais Latin1_General ? Are url Latin1_General ? Je ne suis pas dérangé par un ordre lexicographique, mais l'égalité pour des index / groupes uniques est importante.

Vous pouvez modifier la table pour définir le classment CS (sensible à la casse) pour cette colonne:

 ALTER TABLE dbo.MyTable ALTER COLUMN URLColumn varchar(max) COLLATE Latin1_General_CS_AS 

Vous pouvez également spécifier le classment dans l'instruction SQL:

 SELECT * FROM dbo.MyTable WHERE UrlColumn like '%AbC%' COLLATE Latin1_General_CS_AS 

Voici un court article pour reference.

Les lettres CI dans la collation indiquent une insensibilité à la casse.

Pour une URL, qui va être un petit sous-set de caractères et de symboles latins, essayez Latin1_General_CS_AI

Latin1_General utilise la page de codes 1252 ( 1 ) et les caractères autorisés de l'URL sont inclus dans cette page de code ( 2 ), vous pouvez donc dire que les URL sont Latin1_General.

Vous n'avez plus qu'à sélectionner l'option sensible à la casse Latin1_General_CS_AS

rfc3986 dit:

La notation ABNF définit ses valeurs terminales comme étant des entiers non négatifs (points de code) basés sur le jeu de caractères codés US-ASCII [ASCII].

Wikipedia dit que les caractères autorisés sont:

 Unreserved May be encoded but it is not necessary ABCDEFGHIJKLMNOPQRSTU VWXYZ abcdefghijklmnopqrstu vwxyz 0 1 2 3 4 5 6 7 8 9 - _ . ~ Reserved Have to be encoded sometimes ! * ' ( ) ; : @ & = + $ , / ? % # [ ] 

Il semble qu'ils ne sont pas des conflits entre ces caractères dans les opérations de comparaison. En outre, vous pouvez utiliser la fonction HASHBYTES pour effectuer cette comparaison.

Mais ce genre d'opération n'est pas le problème majeur. Le problème majeur est que http://domain:80 et http://domain peuvent être identiques. Aussi avec des caractères codés, une URL peut sembler différente avec les caractères codés.

À mon avis, RDBMS incorporera ce type de structures comme de nouveaux types de données: url, numéro de téléphone, adresse e-mail, adresse mac, mot de passe, latitude, longitude, …. Je pense que la collation peut aider mais ne va pas résoudre ce problème.