Мне интересно, что такое правила для преобразований типа mysql. например.
select foo/2 from table
, кажется, дает десятичное число, если столбец foo
является int. select sum(foo) from table
возвращает столбец суммы (foo) назад как double, если foo
является поплавком. select i*i from table
дает значение bigint, если я является int.
Каковы правила преобразования типов здесь, когда используются общие операторы, такие как + -/* или агрегаты, такие как sum/avg?
Правила преобразования типов довольно просты. Цитирование из Руководство по MySQL:: Преобразование типов в оценке выражений:
Когда оператор используется с операндами разных типов, происходит преобразование типа, чтобы сделать операнды совместимыми. Некоторые преобразования происходят неявно.
Следующие правила описывают, как происходит преобразование для операций сравнения:
Если один или оба аргумента
NULL
, результатом сравнения являетсяNULL
, за исключением оператора сравнения равенстваNULL
-safe<=>
. ДляNULL <=> NULL
результатtrue
. Преобразование не требуется.Если оба аргумента в операции сравнения являются строками, они сравниваются как строки.
Если оба аргумента являются целыми числами, они сравниваются как целые числа.
Шестнадцатеричные значения рассматриваются как двоичные строки, если они не сравниваются с числом.
Если один из аргументов является столбцом
TIMESTAMP
илиDATETIME
, а другой аргумент является константой, константа преобразуется в метку времени перед выполнением сравнения. Это сделано, чтобы быть более дружественным ODBC. Обратите внимание, что это не делается для аргументовIN()
. Чтобы быть в безопасности, всегда используйте полные даты, дату или временные строки при выполнении сравнений. Например, для достижения наилучших результатов при использованииBETWEEN
с датой или временем используйтеCAST()
, чтобы явно преобразовать значения в нужный тип данных.Во всех остальных случаях аргументы сравниваются как числа с плавающей запятой (реальные).
В случае арифметических операторов результат определяется в соответствии со следующими правилами. Цитата из Руководство по MySQL:: Арифметические операторы
В случае
-
,+
и*
результат вычисляется с точностьюBIGINT
(64-разрядной), если оба аргумента являются целыми числами.Если один из аргументов является целым числом без знака, а другой аргумент также является целым числом, результатом является целое число без знака.
Если какой-либо из операндов a
+
,-
,/
,*
,%
является реальным или строковым значением, то точность результата - это точность аргумента с максимальной точностью.В делении, выполненном с помощью
/
, масштаб результата при использовании двух точных значений - это масштаб первого аргумента плюс значение системной переменной div_precision_increment (по умолчанию это 4). Например, результат выражения5.05 / 0.014
имеет шкалу из шести знаков после запятой(360.714286)
.
Тогда для агрегатных функций применяется следующее. Цитирование из Руководство по MySQL:: Совокупные функции:
Для числовых аргументов функции отклонения и стандартного отклонения возвращают значение
DOUBLE
. ФункцииSUM()
иAVG()
возвращают значениеDECIMAL
для аргументов точного значения (integer илиDECIMAL
) и значениеDOUBLE
для аргументов приблизительного значения (FLOAT
илиDOUBLE
).