2010-09-19 3 views
0

Мне интересно, каковы правила для преобразований типа mysql. напримерПравила преобразования типа MySQL

select foo/2 from table, похоже, дает десятичное число, если столбец foo является int. select sum(foo) from table возвращает столбец суммы (foo) в виде двойного, если foo является поплавком. select i*i from table дает значение bigint, если i является int.

Каковы правила преобразования типов здесь при использовании общих операторов, таких как + -/* или агрегаты, такие как sum/avg?

ответ

2

Правила преобразования типов довольно просты. Цитата из MySQL Manual :: Type Conversion in Expression Evaluation:

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

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

  • Если один или оба аргумента NULL, результат сравнения NULL, для оператора сравнения равенства в NULL<=> -safe исключением. Для NULL <=> NULL результатом является true. Преобразование не требуется.

  • Если оба аргумента в операции сравнения являются строками, они сравниваются как строки.

  • Если оба аргумента являются целыми числами, они сравниваются как целые числа.

  • Шестнадцатеричные значения рассматриваются как двоичные строки, если их не сравнить с числом.

  • Если один из аргументов является столбцом TIMESTAMP или DATETIME, а другой аргумент является константой, константа преобразуется в метку времени перед выполнением сравнения. Это сделано, чтобы быть более дружественным ODBC. Обратите внимание, что это не делается для аргументов IN() Чтобы быть в безопасности, всегда используйте полные даты, дату или временные строки при выполнении сравнений. Например, для достижения наилучших результатов при использовании BETWEEN с датой или временем используйте CAST(), чтобы явно преобразовать значения в нужный тип данных.

  • Во всех остальных случаях аргументы сравниваются как числа с плавающей запятой (реальные).

В случае арифметических операторов, результат определяется в соответствии со следующими правилами. Цитирование из MySQL Manual :: Arithmetic Operators

  • В случае -, + и *, результат вычисляется с BIGINT (64-бит) точности, если оба аргумента являются целыми числами.

  • Если один из аргументов является целым числом без знака, а другой аргумент также является целым числом, результатом является целое число без знака.

  • Если какое-либо из операндов +, -, /, *, % реальные или строковое значение, точность результата является точностью аргумента с максимальной точностью.

  • В делении, выполненном с использованием /, шкала результата при использовании двух точных значений представляет собой масштаб первого аргумента плюс значение системной переменной div_precision_increment (по умолчанию это 4). Например, результат выражения 5.05/0.014 имеет шкалу из шести знаков после запятой (360.714286).

Тогда для агрегатных функций, применяется следующее. Цитирование из MySQL Manual :: Aggregate Functions:

Для числовых аргументов, стандартные функции отклонения дисперсии и возвращают значение DOUBLE. Функциии AVG() возвращают значение DECIMAL для аргументов точного значения (целое или DECIMAL) и значение DOUBLE для аргументов приблизительной стоимости (FLOAT или DOUBLE).

+0

В то время как это много отвечает, он не говорит много о, например. 1/2, давая десятичное число, или i * i, давая bigint – Anonym

+0

@ Анимация: Обновлен мой ответ с правилами об арифметических операторах. –

Смежные вопросы