MySQL类型转换的规则

时间:2010-09-19 03:26:26

标签: mysql

我想知道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等聚合时,此类型转换的规则是什么?

1 个答案:

答案 0 :(得分:2)

类型转换规则非常简单。引自MySQL Manual :: Type Conversion in Expression Evaluation

  

当运算符与不同类型的操作数一起使用时,会发生类型转换以使操作数兼容。有些转换是隐含的。

     

以下规则描述了比较操作的转换方式:

     
      
  • 如果一个或两个参数都是NULL,则比较结果为NULL,但NULL - 安全<=>等式比较运算符除外。对于NULL <=> NULL,结果为true。无需转换。

  •   
  • 如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。

  •   
  • 如果两个参数都是整数,则将它们作为整数进行比较。

  •   
  • 如果不与数字进行比较,十六进制值将被视为二进制字符串。

  •   
  • 如果其中一个参数是TIMESTAMPDATETIME列而另一个参数是常量,则在执行比较之前将常量转换为时间戳。这样做是为了更友好的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值( FLOATDOUBLE)。