Php 在进行迁移时,如何创建浮动而不是双精度的字段?
我正在使用Laravel的迁移系统重新创建现有的数据库结构。这些表需要与现有数据库中的表完全匹配 表中的一个字段如下所述: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类型列。但是我需要一个特别定义为浮点的,
`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)在Laravel中,code>的意思与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在技术上是一样的。