我想知道mysql类型转换的规则是什么。 e.g。
如果select foo/2 from table
列是int,则 foo
似乎会产生小数。 select sum(foo) from table
如果foo
是浮点数,则将sum(foo)列返回为double。如果我是一个int,select i*i from table
会给出一个bigint。
使用+ - / *等常用运算符或sum / avg等聚合时,此类型转换的规则是什么?
答案 0 :(得分:2)
类型转换规则非常简单。引自MySQL Manual :: Type Conversion in Expression Evaluation:
当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐含的。
以下规则描述了比较操作的转换方式:
如果一个或两个参数都是
NULL
,则比较结果为NULL
,但NULL
- 安全<=>
等式比较运算符除外。对于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
值。SUM()
和AVG()
函数返回精确值参数的DECIMAL
值(整数或DECIMAL
),以及近似值参数的DOUBLE
值(FLOAT
或DOUBLE
)。