Spec-Zone .ru
спецификации, руководства, описания, API

12.2. Преобразование типов в Вычислении выражения

Когда оператор используется с операндами различных типов, преобразование типов происходит, чтобы сделать операнды совместимыми. Некоторые преобразования происходят неявно. Например, MySQL автоматически преобразовывает числа в строки по мере необходимости, и наоборот.

mysql> SELECT 1+'1';        -> 2mysql> SELECT CONCAT(2,' test');        -> '2 test'

Также возможно преобразовать число в строку, явно используя CAST() функция. Преобразование происходит неявно с CONCAT() функционируйте, потому что это ожидает строковые параметры.

mysql> SELECT 38.8, CAST(38.8 AS
        CHAR);        -> 38.8, '38.8'mysql> SELECT 38.8,
        CONCAT(38.8);        -> 38.8, '38.8'

См. позже в этом разделе для информации о наборе символов неявного числа к преобразованиям строк.

Следующие правила описывают, как преобразование происходит для операций сравнения:

Для получения информации о преобразовании значений от одного временного типа до другого см. Раздел 11.3.7, "Преобразование Между Типами Даты и Времени".

Следующие примеры иллюстрируют преобразование строк к числам для операций сравнения:

mysql> SELECT 1 > '6x';        -> 0mysql> SELECT 7 > '6x';        -> 1mysql> SELECT 0 > 'x6';        -> 0mysql> SELECT 0 = 'x6';        -> 1

Для сравнений строкового столбца с числом MySQL не может использовать индексирование на столбце, чтобы искать значение быстро. Если str_col индексированный строковый столбец, индексирование не может использоваться, выполняя поиск в следующем операторе:

SELECT * FROM tbl_name WHERE str_col=1;

Причина этого состоит в том, что есть много различных строк, которые могут преобразовать в значение 1, такой как '1', ' 1', или '1a'.

Сравнения, которые используют числа с плавающей точкой (или значения, которые преобразовываются в числа с плавающей точкой) приблизительны, потому что такие числа неточны. Это могло бы привести к результатам, которые кажутся непоследовательными:

mysql> SELECT '18015376320243458' =
        18015376320243458;        -> 1mysql> SELECT
        '18015376320243459' = 18015376320243459;        -> 0

Такие результаты могут произойти, потому что значения преобразовываются в числа с плавающей точкой, которые имеют только 53 бита точности и подвергаются округлению:

mysql> SELECT
        '18015376320243459'+0.0;        -> 1.8015376320243e+16

Кроме того преобразование от строки до с плавающей точкой и от целого числа до с плавающей точкой не обязательно происходит тот же самый путь. Целое число может быть преобразовано в с плавающей точкой ЦП, тогда как строка является преобразованной цифрой цифрой в работе, которая включает умножение с плавающей точкой.

Показанные результаты изменятся на различных системах, и могут влияться факторами, такими как архитектура ЭВМ или версия компилятора или уровень оптимизации. Один способ избежать таких проблем состоит в том, чтобы использовать CAST() так, чтобы значение не было преобразовано неявно в число с плавающей точкой:

mysql> SELECT CAST('18015376320243459' AS UNSIGNED) =
        18015376320243459;        -> 1

Для получения дополнительной информации о сравнениях с плавающей точкой, см. Раздел C.5.5.8, "Проблемы со Значениями С плавающей точкой".

В MySQL 5.6 сервер включает dtoa, библиотека преобразования, которая обеспечивает основание для улучшенного преобразования между строкой или DECIMAL значения и приближенное значение (FLOAT/DOUBLE) числа:

Поскольку преобразования, произведенные этой библиотекой, отличаются в некоторых случаях от предыдущих результатов, потенциал существует для несовместимостей в приложениях, которые полагаются на предыдущие результаты. Например, приложениям, которые зависят от определенного точного следствия предыдущих преобразований, возможно, понадобилась бы корректировка, чтобы разместить дополнительную точность.

dtoa библиотека предоставляет преобразованиям следующие свойства. D представляет значение с a DECIMAL или строковое представление, и F представляет число с плавающей точкой в собственном двоичном файле (IEEE) формат.

Эти свойства подразумевают это F -> D -> F преобразования не без потерь если F -inf, +inf, или NaN. Последние значения не поддерживаются, потому что стандарт SQL определяет их как недопустимые значения для FLOAT или DOUBLE.

Для D -> F -> D преобразования, достаточное условие для без потерь - это D использование 15 или меньше цифр точности, не нестандартное значение, -inf, +inf, или NaN. В некоторых случаях преобразование без потерь даже если D имеет больше чем 15 цифр точности, но это - не всегда случай.

В MySQL 5.6 неявное преобразование числового или временного значения, чтобы представить в виде строки производит значение, у которого есть набор символов и сопоставление, определенное character_set_connection и collation_connection системные переменные. (Эти переменные обычно устанавливаются с SET NAMES. Для получения информации о наборах символов соединения см. Раздел 10.1.4, "Наборы символов соединения и Сопоставления".)

Это означает, что такое преобразование приводит к символьной (недвоичной) строке (a CHAR, VARCHAR, или LONGTEXT значение), кроме в случае, в который устанавливается набор символов соединения binary. В этом случае результатом преобразования является двоичная строка (a BINARY, VARBINARY, или LONGBLOB значение).