Поиск

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

В огромном большинстве запросов вполне очевидно, какой порядок использует 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
См.раздел Поразрядные функции.