|
Spec-Zone .ru
спецификации, руководства, описания, API
|
В значительном большинстве операторов это очевидно что использование MySQL сопоставления разрешить работу
сравнения. Например, в следующих случаях, это должно быть четким, что сопоставление является сопоставлением
столбца charset_name:
SELECT x FROM T ORDER BY x;SELECT x FROM T WHERE x = x;SELECT DISTINCT x FROM T;
Однако, с многократными операндами, может быть неоднозначность. Например:
SELECT x FROM T WHERE x = 'Y';
Если использование сравнения сопоставление столбца x, или строкового литерала 'Y'? Оба x и 'Y' имейте
сопоставления, так, какое сопоставление имеет приоритет?
Стандартный SQL разрешает такое использование вопросов, что имело обыкновение вызываться правилами "coercibility". MySQL присваивает значения coercibility следующим образом:
Явное COLLATE у пункта есть coercibility 0. (Не
принудительный вообще.)
У связи двух строк с различными сопоставлениями есть coercibility 1.
У сопоставления столбца или сохраненного стандартного параметра или локальной переменной есть coercibility 2.
"Система, постоянная" (строка, возвращенная функциями такой как USER() или VERSION())
имеет coercibility 3.
У сопоставления литерала есть coercibility 4.
NULL или выражение, которое получается из NULL имеет coercibility 5.
MySQL использует значения coercibility со следующими правилами разрешить неоднозначности:
Используйте сопоставление с самым низким значением coercibility.
Если у обеих сторон есть тот же самый coercibility, то:
Если обе стороны являются Unicode, или обе стороны не являются Unicode, это - ошибка.
Если у одной из сторон есть набор символов Unicode, и у другой стороны есть набор символов не-Unicode, сторона с победами набора символов Unicode, и автоматическое преобразование набора символов применяется к стороне не-Unicode. Например, следующий оператор не возвращает ошибку:
SELECT CONCAT(utf8_column, latin1_column) FROM t1;
Это возвращает результат, у которого есть набор символов utf8 и то же самое сопоставление как utf8_column.
Значения latin1_column автоматически преобразовываются в
utf8 перед конкатенацией.
Для работы с операндами от того же самого набора символов, но того
соединения a _bin сопоставление и a _ci или _cs сопоставление, _bin сопоставление используется. Это подобно тому, как
операции, которые смешивают недвоичные и двоичные строки, оценивают операнды как двоичные
строки, за исключением того, что это для сопоставлений, а не типов данных.
Хотя автоматическое преобразование не находится в стандарте SQL, документ стандарта SQL действительно говорит, что каждый набор символов является (с точки зрения поддерживаемых символов) "подмножеством" Unicode. Поскольку это - известный принцип, который, "что применяется к надмножеству, может примениться к подмножеству," мы полагаем, что сопоставление для Unicode может просить сравнения со строками не-Unicode.
Примеры:
| Сравнение | Используемое сопоставление |
|---|---|
column1 = 'A' |
Используйте сопоставление column1 |
column1 = 'A' COLLATE x |
Используйте сопоставление 'A' COLLATE x |
column1 COLLATE x = 'A' COLLATE y |
Ошибка |
COERCIBILITY()
функция может использоваться, чтобы определить coercibility строкового выражения:
mysql>SELECT COERCIBILITY('A' COLLATE latin1_swedish_ci);-> 0mysql>SELECT COERCIBILITY(VERSION());-> 3mysql>SELECT COERCIBILITY('A');-> 4
См. Раздел 12.14, "информационные Функции".
Для неявного преобразования числового или временного значения к строке, той, которая происходит для параметра
1 в выражении CONCAT(1, 'abc'), результатом является символьная (недвоичная) строка, у
которой есть набор символов и сопоставление, определенное character_set_connection и collation_connection системные переменные. См. Раздел
12.2, "Преобразование типов в Вычислении выражения".