Jak*_*son 5 php mysql database-migration mariadb laravel
我正在使用 Laravel 的迁移系统重新创建现有的数据库结构。这些表需要与现有数据库中的表完全匹配。
表中的字段之一描述如下:
`frequency` float unsigned NOT NULL DEFAULT 0,
Run Code Online (Sandbox Code Playgroud)
查看 Laravel 迁移文档,我看到以下选项:
$table->float('amount', 8, 2);
$table->double('column', 15, 8);
Run Code Online (Sandbox Code Playgroud)
这两种列类型都会创建一个double具有长度和小数点的类型列。但我需要一个专门定义为float没有指定长度和零小数点的 a 。
可以使用 Laravel 的迁移系统吗?
不要在MySQL 上或之中使用。该功能仅属于. 如果您想要零小数位,请使用某种形式的. 另一方面,也许你的频率是千兆赫?在没有精度或小数的情况下,这是最合适的。(m,n)FLOATDOUBLEDECIMALINTfrequencyFLOAT
请注意,1GHz 不适合FLOAT(8,2),但它可以适合FLOAT。
为什么两者都 FLOAT占用 4 个字节;DOUBLE需要 8;两者都是几乎所有计算机硬件都实现的 IEEE-754 标准的一部分。在“旧”时代(当时 1MB RAM 是一台“大”机器;标准可以追溯到 80 年代初),节省 4 个字节是一件大事。如果 Laravel 将 float 转换为 double,那是它的选择;MySQL 会选择其中之一。
几乎在所有情况下FLOAT,DOUBLE值和变量都是可以互换的。 但是... 存储的值FLOAT和存储的相同值DOUBLE可能会导致比较不相等的值。例如,几乎所有语言、硬件等中的 float(1.234) != double(1.234)。
MySQL 对 frequency float unsigned NOT NULL DEFAULT 0.
但是,如果$table->float('amount', 8, 2);Laravel 中的含义与 MySQL 中的 相同FLOAT(8,2),那么您可能会遇到大问题。
1234567.89将被截断为999999.99. 并且1.234将被截断为1.23,然后四舍五入为二进制。
听起来像是 Lavaral 的错误报告。(抱歉,我从未使用过 Lavaral,所以我猜测它的细节。我确实了解 MySQL 和 IEEE-754。)