用于在MySQL中存储高精度小数的数据类型

时间:2013-11-22 04:45:05

标签: mysql sql

与此question类似,我有一个CSV货币汇率,最高可达9位小数。

例如:0.5586592184470.0110767.02E-050.00064113820832.46989

我应该为列使用哪种数据类型?

我尝试FLOATDOUBLEDECIMAL(11,11),他们会产生以下警告之一:

  1. 第X行列'column_name'超出范围值
  2. 第X行列'column_name'的值被截断
  3. 当我使用SHOW WARNINGS命令时。

    仅供参考,SQL语句如下(但我猜它没有关系):

    LOAD DATA LOCAL INFILE 'currency.csv' INTO TABLE the_currency FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' (currency_code, currency_buyin, currency_buyout);
    

    CSV的样本数据如下:

    PHP,41.46218559,0.024118362
    PKR,95.71731228,0.010447431
    PLN,3.2056255,0.311951599
    PYG,4470.011076,0.000223713
    QAR,3.641148462,0.274638623
    RON,3.524472347,0.283730415
    RSD,87.59544136,0.011416119
    RUB,31.41607934,0.031830834
    RWF,626.1686594,0.001597014
    SAR,3.750383024,0.266639432
    SBD,7.130814403,0.140236436
    SCR,13.08102784,0.076446592
    SDG,4.412494807,0.226629162
    SEK,6.683528257,0.149621571
    SGD,1.221878378,0.81841206
    SHP,0.623503208,1.603840987
    SLL,4349.905174,0.00022989
    SOS,1615.486542,0.000619009
    SPL,0.166666667,6
    SRD,3.274628066,0.305378193
    STD,18949.99968,5.28E-05
    SVC,8.75,0.114285714
    

    MySQL版本:5.5.34-0ubuntu0.12.04.1我正在使用console命令。

2 个答案:

答案 0 :(得分:8)

如果你想要之前的11位数以及小数位后的,你需要DECIMAL(22,11)DECIMAL(11,11)小数位之前没有任何数字的存储空间,甚至根本没有效果。

对于存储小数或货币值,DECIMALNUMERIC(大致相当)是要走的路。转换率在概念上有点不同 - 因为偶尔它们可能会因更广泛的因素而变化 - 但DECIMAL可能是一个合理的起点,因为至少它可以为您提供准确的十进制数学结果。

替代方案是DOUBLEFLOAT没有很好的精确度),这将允许存储超高息货币之间的转换率;但是,将浮点缩放混合到'十进制'数学中需要在输出上采用明确定义的舍入策略。

答案 1 :(得分:2)

十进制是你需要的。参数是长度,然后是小数位。十进制(长度,小数位)

小数(4,2)示例=最大值为99.99 十进制(6,2)=最大值是9999.99

希望这有帮助。