Laravel, MySQL - int의 크기가 지정된 경우에도 column_type이 "int (11)"로 설정됩니다.

3399 단어 laravelmysqlrdb
환경
MySQL 버전: 5.7
라라벨 버전 : 8.16.1
PHP 버전 : 7.4.7

Laravel에서 마이그레이션 파일에 테이블 열을 추가할 때 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 유형의 경우 크기가 이미 미리 결정되어 원하는 대로 변경할 수 없음을 의미합니다.
테이블은 여기 있습니다.


유형
스토리지(바이트)
서명된 최소값
서명되지 않은 최소값
서명된 최대값
부호 없는 최대값


TINYINT
1
-128
0
127
255

스몰린트
2
-32768
0
32767
65535

중간

-8388608
0
8388607
16777215

지능
4
-2147483648
0
2147483647
4294967295

비긴트
8
-263
0
263-1
264-1

결론



"MySQL에서 int를 사용하면 항상 "int(11)"이 되지만, MySQL이 작동하는 방식일 뿐입니다.

그렇다면 tinyint는 어떻습니까?
찾아보니 이런게 있네요.

Database: Migrations - Laravel - The PHP Framework For Web Artisans

The following column types can be modified: bigInteger, binary, boolean, date, dateTime, dateTimeTz, decimal, integer, json, longText, mediumText, smallInteger, string, text, time, unsignedBigInteger, unsignedInteger, unsignedSmallInteger, and uuid. To modify a timestamp column type a Doctrine type must be registered.



요컨대, 그것은 말한다
"int에서 tinyint로 변경할 수 없습니다."
(그 반대도 가능)

반대로 할 수 없다면 롤백이 제대로 되지 않는 것이므로 피해야 합니다.

사실 나도 불필요한 오류에 시달렸다.

따라서 int 또는 bigint를 사용하면 기본 길이로 사용해도 됩니다.
(오히려 다른 방법은 없습니다.)

메모



int에서 tinyint로 변경하려면 Laravel 구문 없이도 가능하지만 테이블 변경을 사용합니다.
예를 들어:

DB::statement("alter table projects modify category_code tinyint;");

좋은 웹페이지 즐겨찾기