Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql中截断的十进制值(小数点后30位)_Php_Mysql_Financial - Fatal编程技术网

Php mysql中截断的十进制值(小数点后30位)

Php mysql中截断的十进制值(小数点后30位),php,mysql,financial,Php,Mysql,Financial,我目前正在使用LOAD DATA LOCAL Infle导入批量财务数据进行处理 文件中的值以30位小数的精度存储,例如: 125.154821679413246187945612314846 但是,当导入此项时,数据总是被截断为10位小数,并带有尾随的零,例如 125.15482167920000000000000000000 该列的设置如下所示:- USD应付十进制数(33,30) 编辑: 表创建脚本: CREATE TABLE IF NOT EXISTS dump

我目前正在使用LOAD DATA LOCAL Infle导入批量财务数据进行处理

文件中的值以30位小数的精度存储,例如:

125.154821679413246187945612314846

但是,当导入此项时,数据总是被截断为10位小数,并带有尾随的零,例如

125.15482167920000000000000000000

该列的设置如下所示:-

USD应付十进制数(33,30)

编辑:

表创建脚本:

CREATE TABLE IF NOT EXISTS dump
                        (
                            SaleID INT NOT NULL AUTO_INCREMENT,
                            Country VARCHAR(8),
                            Label VARCHAR(20),
                            Product VARCHAR(5),
                            URI VARCHAR(20),
                            UPC VARCHAR(20),
                            EAN VARCHAR(20),
                            ISRC VARCHAR(20),
                            TrackName VARCHAR(28),
                            ArtistName VARCHAR(64),
                            ComposerName VARCHAR(64),
                            AlbumName VARCHAR(54),
                            Quantity INT(10),
                            USDPayable decimal(33,30),
                            PRIMARY KEY (SaleID)
                        );
加载数据脚本:

LOAD DATA 
  LOCAL INFILE '<my file>'
    INTO TABLE dump
        IGNORE 3 LINES
              (Country, Label, Product, URI, UPC, EAN, ISRC, 
               TrackName, ArtistName, ComposerName, AlbumName,
               Quantity, USDPayable)
更新


过了一会儿,我决定咬紧牙关,使用PHP逐行流式处理文件,在插入表之前准备好处理这些值。使用fgets(),此值在此处也被截断。。。这几乎就像mysql和php认为被截断的值是文件读取时的文本值一样。非常令人困惑的

php是一种弱类型语言。如果它看到一个它假定为十进制数的数字,默认情况下,它会将其作为一个
浮点数处理,这是一个ieee 754双精度近似数。MySQL中的内部数字处理也是如此

ieee 754双精度对你的版税计算来说不够精确(可怜可怜可怜的音乐家们;你不能用百万分之一的便士买任何东西)

因此,为表声明高精度十进制类型是正确的。但你必须欺骗MySQL,使其将数字当作字符串来处理,而不是采用它最喜欢的ieee 754快捷方式(或者我们可以说是黑客)

您可以尝试以下方法:

  LOAD DATA 
LOCAL INFILE 'C:\\yadda\\yadda\\sample.tsv'
  INTO TABLE dump
             (Country, Label, Product, URI, UPC, ISRC, Quantity, @USDPayable)
         SET USDPayable = CAST(@USDPayable AS DECIMAL(33,30) );
这将安排在输入时将美元的一小部分作为字符串处理,然后使用SET子句将其转换为所需的十进制格式

请注意,括号中的列列表如何将每个列中的值分配给
@USDPayment

这对我很管用。如果它对你不起作用,你可能应该考虑移到MySQL的后期版本。

请注意,您必须更改实际数据的列列表。您没有在示例tsv文件中提供某些列


使用此类货币数据时,请注意弱数据类型。请仔细检查你的总数是否正确。您可能需要切换到强类型语言。

请尝试number_format()@billahmed。您可以在此基础上进行扩展吗?如果你的意思是PHP函数,我希望避免任何预处理(它解释了使用本地数据的加载数据),因为文件中包含了成百上千的行,请考虑你的问题,向我们展示你的输入文件的几行,并且,
的输出为您试图加载的表显示CREATE TABLE which
。看起来MySQL正在从您的
infle
读取数字,将其转换为内部本机数字格式(双精度浮点),然后将其转换为十进制,从而丢失精度。您可以尝试将这些数字用引号括起来,这样,
LOAD DATA infle
在输入的过程中将假定它们是文本字符串,而不是数字。谢谢@O.Jones,我已经编辑了这个问题以包含表创建脚本。关于用引号括起小数点,该文件非常庞大,因此直接转储到db是为了避免任何需要将整个文件加载到内存中的预处理。我仍然认为,如果您显示十几行左右的输入文件,这会很有帮助,或者你的文件格式中的一些虚假数据。我是一个很容易向那些向音乐家支付版税的人寻求帮助的人。我的家人和朋友中有很多音乐家。非常感谢@O.Jones这似乎很好地完成了这项任务,还有很多额外的有用信息。这让我对继续依赖PHP来完成这类事情感到相当怀疑!
  LOAD DATA 
LOCAL INFILE 'C:\\yadda\\yadda\\sample.tsv'
  INTO TABLE dump
             (Country, Label, Product, URI, UPC, ISRC, Quantity, @USDPayable)
         SET USDPayable = CAST(@USDPayable AS DECIMAL(33,30) );