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

Rap*_*tor 0 mysql sql

与此问题类似,我有一个CSV货币汇率,精确到小数点后9位.

例如:0.558659218,4470.011076,7.02E-05,0.000641138,20832.46989

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

我想FLOAT,DOUBLEDECIMAL(11,11)他们产生以下警告之一:

  1. 超出行X列"column_name"的范围值
  2. 在行X处为列'column_name'截断的值

当我使用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);
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*s W 8

你需要DECIMAL(22,11),如果你想11位之前以及之后的小数位.在小数DECIMAL(11,11)之前没有任何数字存储,甚至几乎没有效果.

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

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