Сопоставление для URL

Предупреждение: я очень мало знаю о сопоставлениях баз данных, поэтому заранее извиняюсь, если что-то из этого очевидно...

У нас есть столбец базы данных, содержащий URL-адреса. Мы хотели бы поместить уникальное ограничение/индекс в этот столбец.

Мне стало известно, что при сопоставлении базы данных по умолчанию Latin1_General_CI_AS в этом столбце существуют дубликаты, потому что (например) URL-адреса http://1.2.3.4:5678/someResource и http://1.2.3.4:5678/SomeResource считаются равными. Часто это не так... Тип сервера, на который указывает этот URL, чувствителен к регистру.

Какая сортировка будет наиболее подходящей для такого столбца? Очевидно, что регистрозависимость обязательна, но Latin1_General? URL-адреса Latin1_General? Меня не беспокоит лексикографический порядок, но важно равенство для уникальных индексов/группировок.


person spender    schedule 20.08.2012    source источник
comment
Почему вы думаете, что сопоставление лучше, чем другие? Недостаточно использовать CS ( 'CS указывает с учетом регистра.' )?   -  person dani herrera    schedule 20.08.2012
comment
Вы канонизируете URL-адреса перед вставкой, например. предотвратить добавление http://host1/SomeResource и http://host1:80/SomeResource? Если нет, вы не получите многого, добавив это ограничение.   -  person Damien_The_Unbeliever    schedule 20.08.2012
comment
@Damien_The_Unbeliever, да, действительно. URL-адреса были полностью обработаны перед вставкой.   -  person spender    schedule 20.08.2012
comment
@danihp: Насколько я понимаю, при определенных сопоставлениях пары символов считаются равными, а при других - нет. Если я прав, это повлияет на мой выбор сопоставления.   -  person spender    schedule 20.08.2012
comment
Я понимаю, я публикую ответ сейчас.   -  person dani herrera    schedule 20.08.2012


Ответы (4)


Вы можете изменить таблицу, чтобы установить CS ( С учетом регистра) параметры сортировки для этого столбца:

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

Также вы можете указать сопоставление в операторе SQL:

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

Вот короткая статья для справки.

person valex    schedule 20.08.2012

Буквы CI в сопоставлении указывают на нечувствительность к регистру.

Для URL-адреса, который будет представлять собой небольшое подмножество латинских букв и символов, попробуйте Latin1_General_CS_AI

person podiluska    schedule 20.08.2012

Latin1_General использует кодовую страницу 1252 (1), и разрешенные символы URL включены в эту кодовую страницу ( 2), поэтому вы можете сказать, что URL-адреса являются Latin1_General.

Вам просто нужно выбрать вариант с учетом регистра Latin1_General_CS_AS

person Joao Leal    schedule 20.08.2012

rfc3986 говорит:

Нотация ABNF определяет его терминальные значения как неотрицательные целые числа (кодовые точки) на основе набора кодированных символов US-ASCII [ASCII].

Википедия говорит, что допустимые символы:

Unreserved
May be encoded but it is not necessary
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9 - _ . ~

Reserved
Have to be encoded sometimes
! * ' ( ) ; : @ & = + $ , / ? % # [ ]

Кажется, что они не конфликтуют между этими символами в операциях сравнения. Кроме того, для сравнения можно использовать функцию HASHBYTES.

Но такая операция не является главной проблемой. Основная проблема в том, что http://domain:80 и http://domain могут совпадать. Также с закодированными символами URL-адрес может выглядеть иначе с закодированными символами.

На мой взгляд, РСУБД будет включать такие структуры в качестве новых типов данных: URL-адрес, номер телефона, адрес электронной почты, адрес Mac, пароль, широта, долгота, .... Я думаю, что сопоставление может помочь, но не решит эту проблему.

person dani herrera    schedule 20.08.2012
comment
В самом деле... учитывая, что Uris являются идентификаторами, я думаю, что их место в качестве типа данных верхнего уровня вполне заслужено. - person spender; 20.08.2012