我知道所有数字的内在含义,即浮点格式固有的可能舍入问题,但在我的情况下,我想将MySQL中的DECIMAL列直接转换为DOUBLE,而不是在下游进行转换。能否有人帮忙?
SELECT my_decimal_field + 0E0 FROM my_table
从MySQL手册中可以看到以下的解释:
数字文字包括精确值(整数和DECIMAL)文字和近似值(浮点数)文字。
用幂和指数表示的数字属于近似值数字。
对数字表达式的处理取决于表达式包含的值的类型:
- 如果有任何近似值,则表达式是近似值且使用浮点算术进行计算。
CREATE DEFINER=`root`@`localhost` FUNCTION `castDecimalAsDouble`(
decimalInput DECIMAL(65,30) ) RETURNS double
DETERMINISTIC
BEGIN
DECLARE doubleOutput DOUBLE;
SET doubleOutput = decimalInput;
RETURN doubleOutput;
END
似乎无法将其转换为DOUBLE
,这会在进行计算并且例如想要在第三位ROUND()
一个DECIMAL 12,2
时带来问题。如果您的foo
和bar
是DECIMAL 12,2字段,则使用ROUND(foo * bar,2)
将忽略附加数字。
话虽如此,您仍然可以像这样做使其正常工作:
ROUND(CAST(foo AS DECIMAL(30,15)*CAST(bar AS DECIMAL(30,15)),2)
使用DECIMAL类型可以节省空间。例如,DECIMAL(4,2)
仅占用2个字节。而FLOAT
需要4个字节,DOUBLE
需要8个字节。
至于原问题,只需执行以下操作:
ALTER TABLE t MODIFY COLUMN c DOUBLE ...;
(“...”应包括您已经拥有的其他内容,例如NOT NULL
。)
CAST
无法转换为DOUBLE
。在这种情况下,我只使用DECIMAL
作为一种有效的中间存储数据的方式。使用查询数据的代码都是以浮点格式表示的。 - c00kiemonsterMySQL
大师知道这是否可能,因此我提出了这个问题。 - c00kiemonsterSMALLINT
和MEDIUMINT
的组合,根据我想要的小数位进行移位。在我的情况下,我的数字需要比比例更高的精度。通过这种方式,我成功将数据库大小减半(与使用DOUBLE
相比)。使用DECIMAL
的原因是对INT
进行任何非INT
操作都会返回DECIMAL
。 - c00kiemonster