Yii2数据库迁移中double()与float()方法有什么区别?
Yii2 迁移方法
float() 与 double() 的实际差异 二者在 Postgres 环境下生成的字段结构完全一致,但在其他场景下存在明确差异,具体说明如下:
- 跨数据库兼容性差异
Yii2 的数据库抽象层会适配不同数据库的语法差异,两个方法在不同数据库下的默认映射规则不同:- MySQL 环境下:
float()会映射为 4 字节单精度浮点数,double()会映射为 8 字节双精度浮点数,二者存储占用、可表达的精度范围都有明显区别 - Postgres 环境下:Postgres 本身没有对 Yii2 定义的抽象浮点类型做区分,Yii2 的 Postgres 方言逻辑中统一将两种方法映射为
double precision类型,所以迁移执行后看到的字段类型完全相同
- MySQL 环境下:
- 代码可维护性差异
如果你的项目后续存在更换数据库类型的可能,比如从 Postgres 迁移到 MySQL,两个方法的最终表现会直接影响业务精度,建议还是要根据业务实际需要的精度范围选择对应方法,不要因为 Postgres 下表现一致就随意选择写法 - 如果需要强制所有数据库都生成一致的浮点类型,可以直接声明原生字段类型,写法如下:
$this->addColumn('table_a', 'value', 'double precision')->null();
内容的提问来源于stack exchange,提问作者pepe_botika69
相关产品推荐
相关产品推荐

