在CakePHP3的Phinx迁移中设置tinyint/smallint的显示长度
解决Laravel迁移设置tinyint(2)字段的问题
我懂你现在的困扰:想把exp字段改成tinyint(2)类型,但用integer配合limit => MysqlAdapter::INT_TINY的写法没法指定显示长度2,还容易踩类型被覆盖的坑。
其实Laravel的Schema Builder已经提供了更直接的方式来处理tinyint类型,不用绕弯子用integer加limit参数,直接看下面的解决方案:
正确的迁移代码写法
你可以直接使用tinyInteger字段类型,然后通过length()方法来指定显示宽度为2,这样就能生成你想要的tinyint(2)了:
写法一:链式调用风格
$table->tinyInteger('exp') ->length(2) ->nullable(false) ->default(0) ->change();
写法二:数组参数风格(和你原来的写法更接近)
$table->changeColumn('exp', 'tinyInteger', [ 'length' => 2, 'null' => false, 'default' => 0 ]);
为什么之前的写法不行?
你之前用integer类型配合limit => MysqlAdapter::INT_TINY,本质是让Laravel把int类型转换成tinyint,但这个时候如果再加上length参数,Laravel会默认把字段类型转回普通的int,所以才会出现int(4)的情况。而直接用tinyInteger类型,Laravel会直接对应MySQL的tinyint,此时的length参数就只会作用于显示宽度,不会改变字段类型。
另外补充一点:MySQL里的tinyint显示宽度(比如这里的2)只是视觉层面的格式限制,不会改变tinyint本身的存储范围(有符号是-128127,无符号是0255),这点不用担心影响数据存储。
内容的提问来源于stack exchange,提问作者D Coder
相关产品推荐
相关产品推荐

