Правила для преобразования типов MySQL

0

Мне интересно, что такое правила для преобразований типа 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?

Теги:

1 ответ

2
Лучший ответ

Правила преобразования типов довольно просты. Цитирование из Руководство по 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).

  • 0
    Хотя это много говорит, это не говорит о том, например, 1/2, получая десятичную дробь, или я *, получая bigint
  • 0
    @ Аноним: Обновлен мой ответ с правилами по арифметическим операторам.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню