Spec-Zone .ru
спецификации, руководства, описания, API
|
Когда оператор используется с операндами различных типов, преобразование типов происходит, чтобы сделать операнды совместимыми. Некоторые преобразования происходят неявно. Например, 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'
См. позже в этом разделе для информации о наборе символов неявного числа к преобразованиям строк.
Следующие правила описывают, как преобразование происходит для операций сравнения:
Если один или оба параметра NULL
, результат сравнения
NULL
, за исключением NULL
- безопасный <=>
оператор сравнения равенства. Для NULL <=> NULL
, результатом является
истина. Никакое преобразование не необходимо.
Если обоими параметрами в работе сравнения являются строки, они сравниваются как строки.
Если обоими параметрами являются целые числа, они сравниваются как целые числа.
Шестнадцатеричные значения обрабатываются как двоичные строки если не по сравнению с числом.
Если одним
из параметров является a TIMESTAMP
или DATETIME
столбец и другой параметр являются константой, константа
преобразовывается в метку времени прежде, чем сравнение будет выполнено. Это делается, чтобы быть более
благоприятным для ODBC. Отметьте, что это не делается для параметров IN()
!, Чтобы быть безопасными, всегда используйте полный datetime,
дату, или строки времени, делая сравнения. Например, чтобы достигнуть лучших результатов при
использовании BETWEEN
с датой или временными стоимостями, использовать CAST()
явно
преобразовать значения в требуемый тип данных.
Подзапрос единственной строки от таблицы или таблиц не считают константой. Например, если подзапрос
возвращает целое число, чтобы быть по сравнению с a DATETIME
значение, сравнение делается как два целых числа. Целое
число не преобразовывается во временное значение. Сравнить операнды как DATETIME
значения, использовать CAST()
явно преобразовать значение подзапроса в DATETIME
.
Если одним из параметров является десятичное значение, сравнение зависит от другого параметра. Параметры сравниваются как десятичные значения, если другим параметром является десятичное или целочисленное значение, или как значения с плавающей точкой, если другим параметром является значение с плавающей точкой.
Во всех других случаях параметры сравниваются как (реальные) числа с плавающей точкой.
Для получения информации о преобразовании значений от одного временного типа до другого см. Раздел 11.3.7, "Преобразование Между Типами Даты и Времени".
Следующие примеры иллюстрируют преобразование строк к числам для операций сравнения:
mysql>SELECT 1 > '6x';
-> 0mysql>SELECT 7 > '6x';
-> 1mysql>SELECT 0 > 'x6';
-> 0mysql>SELECT 0 = 'x6';
-> 1
Для сравнений строкового столбца с числом MySQL не может использовать индексирование на столбце, чтобы искать
значение быстро. Если str_col
индексированный строковый столбец,
индексирование не может использоваться, выполняя поиск в следующем операторе:
SELECT * FROMtbl_name
WHEREstr_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.7 сервер включает dtoa
, библиотека преобразования, которая обеспечивает
основание для улучшенного преобразования между строкой или DECIMAL
значения и приближенное значение (FLOAT
/DOUBLE
) числа:
Непротиворечивое преобразование заканчивается через платформы, который устраняет, например, Unix против различий в преобразовании Windows.
Точное представление значений в случаях, где результаты ранее не обеспечивали достаточную точность, такой что касается значений близко к пределам IEEE.
Преобразование чисел, чтобы представить формат в виде строки с самой лучшей
точностью. Точность dtoa
всегда то же самое или лучше чем та из функций
стандартной библиотеки для C.
Поскольку преобразования, произведенные этой библиотекой, отличаются в некоторых случаях от предыдущих результатов, потенциал существует для несовместимостей в приложениях, которые полагаются на предыдущие результаты. Например, приложениям, которые зависят от определенного точного следствия предыдущих преобразований, возможно, понадобилась бы корректировка, чтобы разместить дополнительную точность.
dtoa
библиотека предоставляет преобразованиям следующие свойства. D
представляет значение с a DECIMAL
или строковое представление, и F
представляет число с плавающей точкой в собственном двоичном файле
(IEEE) формат.
F
-> D
преобразование делается с самой лучшей точностью,
возвращаясь D
как самая короткая строка, которая уступает F
когда чтение въезжает задним ходом и округленный к
самому близкому значению в собственном двоичном формате как определено IEEE.
D
-> F
преобразование делается так, что F
самое близкое собственное двоичное число к входной строке
десятичного числа D
.
Эти свойства подразумевают это F
-> D
-> F
преобразования не
без потерь если F
-inf
, +inf
, или NaN
. Последние значения не поддерживаются,
потому что стандарт SQL определяет их как недопустимые значения для FLOAT
или DOUBLE
.
Для D
-> F
-> D
преобразования, достаточное условие для без потерь - это D
использование 15 или меньше цифр точности, не нестандартное
значение, -inf
, +inf
, или NaN
. В некоторых случаях преобразование без потерь даже если D
имеет больше чем 15 цифр точности, но это - не всегда случай.
В MySQL 5.7 неявное преобразование числового или временного значения, чтобы представить в виде строки производит
значение, у которого есть набор символов и сопоставление, определенное character_set_connection
и collation_connection
системные переменные. (Эти переменные обычно
устанавливаются с SET NAMES
. Для получения информации о наборах символов соединения см. Раздел 10.1.4, "Наборы символов соединения
и Сопоставления".)
Это означает, что такое преобразование приводит к символьной (недвоичной) строке (a CHAR
, VARCHAR
, или LONGTEXT
значение), кроме в случае, в который устанавливается набор символов соединения binary
. В этом случае результатом преобразования является двоичная строка (a BINARY
, VARBINARY
, или LONGBLOB
значение).