当有人的操作数不是整数时,有人可以澄清MySQL DIV运算符如何工作,或者应该工作吗?
据说它执行“整数除法” - 但是当操作数不是整数时,它看起来像FLOOR(x / y)而不是(预期的)FLOOR(x)DIV FLOOR(y)。
例如,使用MySQL v5.5.37:
SELECT 5.6 DIV 5.7
SELECT 5.7 DIV 5.6
分别返回0和1。
根据MySQL手册:
整数除法。与FLOOR()类似,但BIGINT值是安全的。
从MySQL 5.5.3开始,如果任一操作数具有非整数类型,则操作数将转换为DECIMAL,并在将结果转换为BIGINT之前使用DECIMAL算术进行除法。如果结果超出BIGINT范围,则会发生错误。
这很令人困惑,因为我希望“cast into decimal”会转换为整数值,即
SELECT CAST(5.4 AS DECIMAL)
SELECT CAST(5.6 AS DECIMAL)
分别产生“5”和“6”。
可能的解释是这个(在手册第12.2节的其他地方找到):
从MySQL 5.5.3开始,服务器包含dtoa,这是一个转换库,它提供了改进字符串或DECIMAL值与近似值(FLOAT / DOUBLE)数字之间转换的基础:
。 。
- F - > D转换以尽可能高的精度完成,返回D作为最短的字符串,当读回时产生F并舍入到IEEE规定的本机二进制格式中的最接近的值。
......所以这对我的意思是表达式:
6.3 DIV 3.141592
实际上被评估为:
FLOOR( (CAST (6.3 AS DECIMAL(65,1)) / (CAST (3.141592 AS DECIMAL(65,6))) )
此外,手册(第12.6.1节)说:
- 在使用/执行除法时,使用两个精确值操作数时的结果比例是第一个操作数的比例加上div_precision_increment系统变量的值(默认为4)。例如,表达式5.05 / 0.014的结果具有六位小数的比例(360.714286)。
但是(对我来说)在使用DIV时这是否应该适用于中间分割结果还不清楚。显然它没有:
SELECT 1999999.9 / 1000000
SELECT 1999999.9 DIV 1000000
分别产生“2.00000”和“1”。
因此,MySQL中的“x DIV y”看起来像:
FLOOR( (CAST (x AS DECIMAL(65,x’s decimal places)) / (CAST (y AS DECIMAL(65,y’s decimal places))
...除非在应用FLOOR()之前没有对中间分割结果进行舍入,否则
知道MySQL实际规格的人能否确认,否认,评论或阐明这一点?
我犹豫是否使用此运算符而没有100%确定它正在做什么,官方文档只是没有提供充分的解释!