与此question类似,我有一个CSV货币汇率,最高可达9位小数。
例如:0.558659218
,4470.011076
,7.02E-05
,0.000641138
,20832.46989
我应该为列使用哪种数据类型?
我尝试FLOAT
,DOUBLE
和DECIMAL(11,11)
,他们会产生以下警告之一:
当我使用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命令。
答案 0 :(得分:8)
如果你想要之前的11位数以及小数位后的,你需要DECIMAL(22,11)
。 DECIMAL(11,11)
在小数位之前没有任何数字的存储空间,甚至根本没有效果。
对于存储小数或货币值,DECIMAL
或NUMERIC
(大致相当)是要走的路。转换率在概念上有点不同 - 因为偶尔它们可能会因更广泛的因素而变化 - 但DECIMAL
可能是一个合理的起点,因为至少它可以为您提供准确的十进制数学结果。
替代方案是DOUBLE
(FLOAT
没有很好的精确度),这将允许存储超高息货币之间的转换率;但是,将浮点缩放混合到'十进制'数学中需要在输出上采用明确定义的舍入策略。
答案 1 :(得分:2)
十进制是你需要的。参数是长度,然后是小数位。十进制(长度,小数位)
小数(4,2)示例=最大值为99.99 十进制(6,2)=最大值是9999.99
希望这有帮助。