Yii2 中 migraions 中的 double() 和 float() 方法有什么区别?
What is the difference between double() and float() methods in migraions in Yii2?
在 Yii2 中创建迁移时,您可以使用:
$this->addColumn('table_a', 'value', $this->float()->null());
或
$this->addColumn('table_a', 'value', $this->double()->null());
但 Postgres 中的结果是相同的类型:双精度。
有区别吗?
不完全一样。
让我们来看看implementation这些方法:
public function float($precision = null)
{
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_FLOAT, $precision);
}
public function double($precision = null)
{
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_DOUBLE, $precision);
}
如您所见,这两种方法使用不同的常量来创建 ColumnSchemaBuilder
实例。常量的value也不一样
const TYPE_FLOAT = 'float';
const TYPE_DOUBLE = 'double';
那么为什么 Postgres 的结果相同?原因在 yii\db\pgsql\QueryBuilder
中,它将两种抽象类型映射到相同的最终类型。
public $typeMap = [
// ...
Schema::TYPE_FLOAT => 'double precision',
Schema::TYPE_DOUBLE => 'double precision',
// ...
];
之所以这样做是因为抽象。它允许您编写无论应用程序是在 Postgres、MySQL 还是 MSSQL 上运行都能正常工作的迁移。
但是,我不知道为什么框架的作者决定将这两种抽象类型映射到 double precision
。
在 Yii2 中创建迁移时,您可以使用:
$this->addColumn('table_a', 'value', $this->float()->null());
或
$this->addColumn('table_a', 'value', $this->double()->null());
但 Postgres 中的结果是相同的类型:双精度。
有区别吗?
不完全一样。
让我们来看看implementation这些方法:
public function float($precision = null)
{
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_FLOAT, $precision);
}
public function double($precision = null)
{
return $this->getDb()->getSchema()->createColumnSchemaBuilder(Schema::TYPE_DOUBLE, $precision);
}
如您所见,这两种方法使用不同的常量来创建 ColumnSchemaBuilder
实例。常量的value也不一样
const TYPE_FLOAT = 'float';
const TYPE_DOUBLE = 'double';
那么为什么 Postgres 的结果相同?原因在 yii\db\pgsql\QueryBuilder
中,它将两种抽象类型映射到相同的最终类型。
public $typeMap = [
// ...
Schema::TYPE_FLOAT => 'double precision',
Schema::TYPE_DOUBLE => 'double precision',
// ...
];
之所以这样做是因为抽象。它允许您编写无论应用程序是在 Postgres、MySQL 还是 MSSQL 上运行都能正常工作的迁移。
但是,我不知道为什么框架的作者决定将这两种抽象类型映射到 double precision
。