Специальные случаи, в которых определение порядка сопоставления сложно

В огромном большинстве запросов вполне очевидно, какой порядок использует MySQL для выполнения операций сравнения. Например, в следующих примерах должно быть ясно, что порядок будет порядком сопоставления, установленным для столбца х:
SELECT х FROM T ORDER BY х; SELECT х FROM T WHERE x = x; SELECT DISTINCT x FROM T;
Однако когда в запросе присутствует несколько операндов, это может быть не столь однозначно, например:
SELECT хFROM T WHERE x = «Y1;
Должен ли запрос использовать порядок сопоставления столбца х или литеральной строки ‘Y1?
Стандарт SQL разрешает такие вопросы, используя то, что можно назвать правилами принуждения (coercibility), сущность которых состоит в следующем: поскольку и х, и 1Y’ имеют свои порядки сопоставления, чей порядок имеет приоритет? Это сложно, од­нако следующие правила разрешают большинство ситуаций:



  1. Явное указание конструкции COLLATE имеет степень принуждения 0 (то есть, при­
    нуждение не применяется).
  2. Конкатенация двух строк с разными порядками сопоставления имеет принуждение 1.
  3. Порядок сопоставления столбца имеет степень принуждения 2.



  • Порядок сопоставления литерала имеет степень принуждения 3.

Приведенные ниже правила разрешают неоднозначность:



  1. Использовать порядок сопоставления с наименьшим значением степени принуж­
    дения.
  2. Если обе стороны имеют одинаковое значение степени принуждения, возникает
    ошибка, если используются разные символьные наборы.

Примеры:
columnl = !Af Использовать порядок сопоставления coluranl
columnl = ‘A’ COLLATE x Использовать порядок сопоставления ‘А’ columnl COLLATE x = ‘A’ COLLATE у Ошибка
С помощью функции COERCIBILITY () можно определить степень принуждения стро­кового выражения:
mysql SELECT COERCIBILITY(‘A’ COLLATE latinl_swedish_ci);
– 0
mysql SELECT COERCIBILITY( ‘A1);
– 3
См.раздел Поразрядные функции.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: