在进行迁移时如何创建浮点但不是双精度的字段?

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 的迁移系统吗?

Ric*_*mes 0

不要在MySQL 上或之中使用。该功能仅属于. 如果您想要零小数位,请使用某种形式的. 另一方面,也许你的频率是千兆赫?在没有精度或小数的情况下,这是最合适的。(m,n)FLOATDOUBLEDECIMALINTfrequencyFLOAT

请注意,1GHz 不适合FLOAT(8,2),但它可以适合FLOAT

为什么两者都 FLOAT占用 4 个字节;DOUBLE需要 8;两者都是几乎所有计算机硬件都实现的 IEEE-754 标准的一部分。在“旧”时代(当时 1MB RAM 是一台“大”机器;标准可以追溯到 80 年代初),节省 4 个字节是一件大事。如果 Laravel 将 float 转换为 double,那是它的选择;MySQL 会选择其中之一。

几乎在所有情况下FLOATDOUBLE值和变量都是可以互换的。 但是... 存储的值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。)