【问题标题】:Changing over from double data type to decimal从双精度数据类型转换为十进制
【发布时间】:2014-06-10 07:12:09
【问题描述】:

我有一个当前使用double 数据类型的数据库,我想将其更改为使用deciaml 数据类型,因为我听说double 数据类型在将货币数据存储为这是近似值。

所以我只是想知道如果我只是更改数据类型是否会出现任何问题?一切都应该改变,不会丢失数据?

【问题讨论】:

  • this
  • @NilayVishwakarma 谢谢!

标签: mysql double decimal type-conversion


【解决方案1】:

是的,除非经过仔细计划,否则您确实存在丢失数据的风险,但只要您确保数据已经一致并且为字段选择正确的长度就可以了。考虑以下几点:

ALTER TABLE yourtable MODIFY COLUMN yourcolumn DECIMAL;

这会将 yourcolumn 转换为 DECIMAL 但它会导致 DECIMAL(10,0) 实际上是整数列。如果您继续并转换为 DECIMAL(10,2):

ALTER TABLE yourtable MODIFY COLUMN yourcolumn DECIMAL(10,2);

您将失去小数点后 2 位以外的所有内容。例如,值 10.025 将转换为 10.03。如果你所有的值已经只有两位小数,你应该没问题。

以上所有内容都适用于 MySQL 5.5.25

【讨论】:

  • 好的,只要我创建具有相同详细信息的新列,例如 (10,2) 或者你有什么就可以了吗?
  • 是的。了解您的数据并确保您的精度匹配或超过您的数据要求。 @AbhikChakraborty 使用新数据类型创建附加列然后验证转换的方法是非常好的方法 - 它可以帮助您发现可能的舍入错误。
  • 第二条语句在我的例子中产生了这个错误:Data truncation: Out of range value for column 'my_column' at row 1.
【解决方案2】:

一种安全的方法是

alter table your_table add column `test_col` decimal(8,2);

然后将现有值复制到新的col as

update table `your_table` set test_col = `col_double_datatype`;

然后检查数据是否正确复制,如果看起来不错,请删除 col_double_datatype 并将 test_col 重命名为您正在使用的名称。

【讨论】:

  • 他特意询问了问题(如果有的话)
  • 将任何现有数据类型转换为新数据类型时总是会出现问题,因此最好进行安全转换而不是进行文字转换,以便在发生意外时您的数据完好无损。
  • 如果我们谈论的是安全性,那么只需在更改之前进行备份。
【解决方案3】:

以上解决方案均不适用于 MySQL 8。 我的解决方案(带有decimal(14, 4) 字段):

UPDATE your_table SET test_col = cast((col_double_datatype * 1000000 / 1000000) as decimal(14, 4));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多