воскресенье, 1 марта 2015 г.

Как SQL сравнивает текстовый тип данных?

Изучаю SQL и, как у любого из новичков возникает масса вопросов. Так как литература иногда не даёт конкретных и точных пояснений, приходится посещать много форумов, задавать кучу вопросов на, так сказать, "банальные" определения. При изучении операторов сравнения столкнулся с вопросом - "Как SQL сравнивает текстовый тип данных?". Для знающих ответ очевиден, но вот для тех, кто учится - всё иначе.

Что такое сравнение?

Сравнение в программировании — общее название ряда операций над парами значений одного типа, реализующих математические отношения равенства и порядка.

Логические операторы реализуют следующие математические операции сравнения:
  • Проверка на равенство (=) или/и неравенство (≠);
  • Проверка на строгое неравенство (<и>);
  • Проверка на нестрогое неравенство (≤и≥).
С данными операциями сравнения все прекрасно знакомы со школы. Числа все умеют сравнивать. Как же тогда применить логическое сравнение по отношению к текстовым значениям?

Представим наш алфавит:
Если сравнивать значения "А" и "Р", то "Р" будет больше "А", т.к. "Р" имеет порядковый номер больше, чем "А". Соответственно "А"<"Б"<"В"<"Г"<... и т.д.

А если сравнивать значения "АА" и "АБ", то "АБ" будет больше "АА", т.к. первые символы у значений совпадают, а второй символ в значении "АБ" больше второго символа значения "АА" ("Б">"А"), отсюда следует, что "АА"<"АБ".

Если сравнивать слова "ДОМ" и "ДНО" и представить это сравнение посимвольным, то "ДОМ">"ДНО", т.к. у "ДОМ" символ "О" больше символа "Н" значения "ДНО".

На примере кодировки CP-1251 с правилом сравнения Case Sensitive (чувствителен к регистру) можно составить таблицу:
Теперь при сравнении значений с разным регистром букв будут учитываться другие "правила". Например: "ДоМ" > "ДОМ", т.к. символ "о" значения "ДоМ" следует после "О" из таблицы, значит он больше символа "О" значения "ДОМ". Следовательно из этого примера - "Сон" и "сон" это два разных слова по своему алфавитному значению.

Если же брать правило сравнения Case Insensitive (не чувствителен к регистру), то значения "ДоМ" и "ДОМ" будут равны, как и "Сон"="сон".

Если использовать правило сравнения Binary будет выполняться правило сравнения по числовому коду (в данном случае используя таблицу CP-1251, где "а" имеет числовой код #E0 (224), а "Б" числовой код #C1 (193) - получится, что "а" > "Б").

Вроде не так сложно всё выглядит. Это то, что я смог понять в сравнении текстового типа данных. Прошу меня строго не судить за предоставленную "переваренную" информацию.