Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/289.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 在进行迁移时,如何创建浮动而不是双精度的字段?_Php_Mysql_Laravel_Mariadb_Database Migration - Fatal编程技术网

Php 在进行迁移时,如何创建浮动而不是双精度的字段?

Php 在进行迁移时,如何创建浮动而不是双精度的字段?,php,mysql,laravel,mariadb,database-migration,Php,Mysql,Laravel,Mariadb,Database Migration,我正在使用Laravel的迁移系统重新创建现有的数据库结构。这些表需要与现有数据库中的表完全匹配 表中的一个字段如下所述: `frequency` float unsigned NOT NULL DEFAULT 0, 查看Laravel迁移文档,我看到以下选项: $table->float('amount', 8, 2); $table->double('column', 15, 8); 这两种列类型都会创建一个长度和小数点为的double类型列。但是我需要一个特别定义为浮点的,

我正在使用Laravel的迁移系统重新创建现有的数据库结构。这些表需要与现有数据库中的表完全匹配

表中的一个字段如下所述:

`frequency` float unsigned NOT NULL DEFAULT 0,
查看Laravel迁移文档,我看到以下选项:

$table->float('amount', 8, 2);
$table->double('column', 15, 8);
这两种列类型都会创建一个长度和小数点为的
double
类型列。但是我需要一个特别定义为
浮点的
,没有指定长度和小数点为零

可以使用Laravel的迁移系统吗?

不要在MySQL中使用
浮点
双精度
上的
(m,n)
。该功能仅适用于
十进制
。如果需要零位小数,请使用某种形式的
INT
。另一方面,也许你的
频率是千兆赫兹?在这一点上,无精度或小数的
FLOAT
是最合适的

请注意,1GHz不适用于
FLOAT(8,2)
,但它适用于
FLOAT

为什么两者都有
FLOAT
需要4个字节<代码>双精度
取8;两者都是IEEE-754标准的一部分,几乎所有计算机硬件都实现了该标准。在“旧”时代(1MB内存是一台“大”机器;标准可追溯到80年代初),节省4字节是一件大事。如果拉威尔将浮动变为双浮动,这就是它的选择;MySQL将采取任何一种方式

几乎在所有情况下,
FLOAT
DOUBLE
值和变量都是可互换的。但是存储在
FLOAT
中的值和存储在
DOUBLE
中的相同值可能会导致值比较不相等。例如,float(1.234)!=几乎所有语言、硬件等的双精度(1.234)

MySQL很满意
频率浮点无符号非空默认值0

但是,如果
$table->float('amount',8,2)的意思与MySQL的
FLOAT(8,2)
相同,那么您可能会遇到大问题

1234567.89
将被截断为
999999
。而
1.234
将被截断为
1.23
,然后四舍五入为二进制


听起来像是拉瓦拉尔的错误报告。(对不起,我从未使用过Lavaral,所以我在猜测它的细节。我知道MySQL和IEEE-754。)

如$table->float()中所述,创建一个float字段。您使用的是什么版本的Laravel/MySQL?没有小数点。这不是一个整数吗?顺便说一下,还有一个十进制选项,它比双精度选项更精确。我使用的是最新的Laravel Homestead Vagrant实例。MySQL版本是
5.7.19-0ubuntu0.16.04.1
。这是虫子吗?因为
->float('whatever')
肯定是在创建一个
列。在谷歌搜索中,我发现了这个(封闭的)Github问题:-似乎是出于设计。是的,我刚刚遇到了这个问题。真奇怪。MySQL之所以使用FLOAT类型是有原因的,即使DOUBLE在技术上是一样的。