본문 바로가기

Mysql

[MySQL] column type BIGINT vs INT

BIGINT(20), INT(10) 이렇게 자료형을 지정하는 것을 종종 보았다.

 

다른 자료형(CHAR, VARCHAR 등)처럼 값의 크기를 지정하는 건가? 무슨 용도인가?

 

내가 궁금한 것은 BIGINT(20), INT(10) 이 괄호 속에 있는 숫자의 의미!

 

결론부터 말하자면,

 

- 괄호() 속에 들어가는 숫자는 디스플레이 너비에 대한 힌트이다.

- 저장공간과는 관련이 없고, 허용하는 값의 범위와도 관련이 없다. 

- 저장공간은 자료형에 따라 부여된다. (int - 4byte 부호있는 정수 > 2^32 | bigint - 8byte 부호있는 정수 > 2^64)

- zerofill 옵션이 있을 경우에만 영향을 미친다. (빈 공간은 0으로 채움)

 

 

MySQL에서 발췌한 것들을 옮겨본다.


MySQL supports an extension for optionally specifying the display width of integer data types in parentheses following the base keyword for the type.

(MySQL은 유형의 기본 키워드 다음에 정수 데이터 유형의 표시 너비를 괄호 안에 선택적으로 지정하기 위한 확장을 지원한다.)

 

 

The display width does not constrain the range of values that can be stored in the column.

(표시 너비는 열에 저장할  있는 값의 범위를 제한하지 않는다.)

 

 

When used in conjunction with the optional (nonstandard) ZEROFILL attribute, the default padding of spaces is replaced with zeros. For example, for a column declared as INT(4) ZEROFILL, a value of 5 is retrieved as 0005.

(선택적 (비표준) ZEROFILL 속성과 함께 사용하면 공백의 기본 패딩이 0으로 바뀐다. 예를 들어, INT (4) ZEROFILL로 선언된 열의 경우 값 5는 0005로 검색된다.)

 

 

If you specify ZEROFILL for a numeric column, MySQL automatically adds the UNSIGNED attribute.

(숫자 열에 ZEROFILL 지정하면 MySQL 자동으로 UNSIGNED 속성을 추가한다.)

 

 

If you store values larger than the display width in an integer column that has the ZEROFILL attribute, you may experience problems when MySQL generates temporary tables for some complicated joins. In these cases, MySQL assumes that the data values fit within the column display width.

(ZEROFILL 속성이 있는 정수 열에 표시 너비보다  값을 저장하면 MySQL 복잡한 조인을 위해 임시 테이블을 생성 할  문제가 발생할  있다.  경우 MySQL 데이터 값이  표시 너비에 맞는 것으로 가정한다.)

 

 

MySQL 지원하는 정수 유형에 필요한 저장 영역  범위

Type

Storage (Bytes)

Minimum Value Signed

Minimum Value Unsigned

Maximum Value Signed

Maximum Value Unsigned

TINYINT

1

-128

0

127

255

SMALLINT

2

-32768

0

32767

65535

MEDIUMINT

3

-8388608

0

8388607

16777215

INT

4

-2147483648

0

2147483647

4294967295

BIGINT

8

-263

0

263-1

264-1

 

< 출처 >

https://dev.mysql.com/doc/refman/8.0/en/integer-types.html

https://dev.mysql.com/doc/refman/8.0/en/numeric-type-attributes.html


간단한 테스트!

 

mysql> create table foo (bar INT(10), bar_zero INT(10) ZEROFILL);
mysql> insert into foo (bar, bar_zero) values (1234,1234);
mysql> select * from foo;
+------+------------+
| bar  | bar_zero   |
+------+------------+
| 1234 | 0000001234 |
+------+------------+

mysql> desc foo;
+----------+---------------------------+------+-----+---------+-------+
| Field    | Type                      | Null | Key | Default | Extra |
+----------+---------------------------+------+-----+---------+-------+
| bar      | int(10)                   | YES  |     | NULL    |       |
| bar_zero | int(10) unsigned zerofill | YES  |     | NULL    |       |
+-------+---------------------------+------+-----+---------+-------+

 

INT와 INT(10) 은 차이가 없다.

INT(10) ZEROFILL : 비어있는 자리는 0으로 채워서 무조건 10자리를 채우고 UNSIGNED 옵션이 자동으로 생성된다. 

 

mysql> alter table foo add (bar_2 int(3), bar_3 int(3) zerofill);

mysql> insert into foo (bar_2, bar_3) values (55555, 55555);

mysql> select bar_2, bar_3 from foo;
+-------+-------+
| bar_2 | bar_3 |
+-------+-------+
| 55555 | 55555 |
+-------+-------+

 

표시 너비는 값의 크기와 상관 없다. (3 지정했지만 5자리 숫자가 들어감)

 

 

 

'Mysql' 카테고리의 다른 글

Mysql dump 허가 거부(permission denied) 메시지  (0) 2020.05.13