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, "Преобразование типов в Вычислении выражения".