Поиск
Специальные случаи, в которых определение порядка сопоставления сложно
В огромном большинстве запросов вполне очевидно, какой порядок использует 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' имеют свои порядки сопоставления, чей порядок имеет приоритет? Это сложно, однако следующие правила разрешают большинство ситуаций:
- Явное указание конструкции COLLATE имеет степень принуждения 0 (то есть, при
нуждение не применяется). - Конкатенация двух строк с разными порядками сопоставления имеет принуждение 1.
- Порядок сопоставления столбца имеет степень принуждения 2.
- Порядок сопоставления литерала имеет степень принуждения 3.
Приведенные ниже правила разрешают неоднозначность:
- Использовать порядок сопоставления с наименьшим значением степени принуж
дения. - Если обе стороны имеют одинаковое значение степени принуждения, возникает
ошибка, если используются разные символьные наборы.
Примеры:
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
См.раздел Поразрядные функции.