かきスタンプ

福岡でフリーランスの物流系のエンジニアやってます。

Laravel : 【MySQL】int のサイズを指定しているにも関わらず、column_type が「int(11)」となってしまう

MySQL のバージョン : 5.7
Laravel のバージョン: 8.16.1
PHP のバージョン: 7.4.7
 
Laravel で migration ファイルにてテーブルのカラムを追加する時、こんな感じで intのサイズを指定する事ができる。

    Schema::table('projects', function (Blueprint $table) {
        $table->integer('category_code')->length(3);
    });

が、実際に生成された MySQLスキーマを見ると、column_type は「int(11)」。
何故? 何か間違えた?

と思って調べてみたら、こんなのが見つかった。

https://stackoverflow.com/questions/25772759/schema-builder-length-of-an-integer

If you're using MySQL, you can't specify the length of an integer column. You can only choose between one of the available integer types, described at http://dev.mysql.com/doc/refman/5.1/en/integer-types.html

要は、「MySQL を使っている場合、長さの指定はできない」らしい。

どういう事かと言うと、MySQL の一部の型は、型によって既にサイズが確定しており、サイズを好き勝手に変える事は出来ないとの事。

その表が、こちら。
https://dev.mysql.com/doc/refman/8.0/en/integer-types.html

結論

MySQL で int を使うなら必ず『 int(11) 』になるけど、MySQL の仕様上、仕方ないから勘弁してね 」

じゃ、tinyint はどうなの?
という事で調べてみたら、こんなのがあった。

Laravelにてテーブルの既存カラムをtinyint型に変更できない問題

要は、
「int → tinyint に変更できない」
との事。(逆なら可)

逆が出来ないという事は、rollback が正常に動かないという事なので、採用は慎重に、というか見送った方がいいだろ。

実際、自分も余計なエラーに悩まされたし。

という訳で、int、bigint を使う場合は、デフォルトの長さでOK。
(というかそれ以外できない)