MySQL의 유형 : BigInt (20) vs Int (20)


221

나는 그 차이 사이에 무엇을 궁금 해서요 BigInt, MediumInt그리고 Int... 그들이 더 큰 숫자를 허용 것이 분명한 것 같다된다 그러나 나는 Int(20)a 또는 a를 만들 수 있으며 BigInt(20)그것이 반드시 크기에 관한 것은 아니라고 생각할 것입니다.

약간의 통찰력은 굉장하고 호기심이 많을 것입니다. 나는 오랫동안 MySQL 을 사용 하고 유형을 선택할 때 비즈니스 요구를 적용하려고 노력했지만이 측면을 이해하지 못했습니다.

답변:


478

http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html을 참조 하십시오

  • INT 4 바이트 부호있는 정수입니다.

  • BIGINT 8 바이트 부호있는 정수입니다.

이들은 각각의 바이트 수에 저장할 수있는 것보다 더 이상 더 적은 값을 허용하지 않습니다. 그것은의 2 32INT과의 2 64 값을 의미합니다 BIGINT.

20 년 INT(20)BIGINT(20)수단 거의 아무것도. 디스플레이 너비에 대한 힌트입니다. 스토리지와 관련이 없으며 열이 허용하는 값의 범위도 아닙니다.

실제로는 ZEROFILL옵션 에만 영향을 미칩니다 .

CREATE TABLE foo ( bar INT(20) ZEROFILL );
INSERT INTO foo (bar) VALUES (1234);
SELECT bar from foo;

+----------------------+
| bar                  |
+----------------------+
| 00000000000000001234 |
+----------------------+

MySQL 사용자가이 INT(20)크기와 비슷한 크기 제한 을보고 가정하는 것은 일반적인 혼란의 원인입니다 CHAR(20). 그렇지 않다.


4
와우,이 포스트는이 주제에 대한 나의 혼란을 완전히 해결했다. 너비 + 최대 값 또는 비트 / 등이라고 생각했을 때 개발자가 이상한 선택처럼 보입니다.
Sh4d0wsPlyr 23.51에

27
`그것은 ZEROFILL 옵션에만 영향을 미칩니다 :`이제 나의 호기심이 끝납니다
Umair

6
나는 그들이 INT 대신 ZEROFILL을 사용하여 디스플레이로 구문을 설계했으면 좋겠다. 예 : bar INT ZEROFILL(20). 훨씬 더 명확했을 것입니다. 그러나 그 결정은 오래 전에 이루어졌으며 지금 변경하면 수백만 개의 데이터베이스 설치가 중단 될 것입니다.
Bill Karwin

1
나는 이것이 매우 혼란 스럽다는 것에 동의합니다. 나는 이번에 숫자가 한계라는 인상을 받았다. 데이터가 특정 범위 내에 있음을 알았을 때 일부 숫자를 작게 만드는 것에 대해 걱정했습니다.
jDub9

2
jDub9 @, 그래, 더 많은 숫자 / DECIMAL은 정밀 인수를 취하는 것이 혼란 않는 값의 범위와 컬럼의 크기에 영향을.
Bill Karwin

40

형식 선언에서 괄호 안의 숫자는 display width입니다 . 이는 데이터 형식에 저장할 수있는 값의 범위와 관련이 없습니다. 선언 할 수 있다고 Int(20)해서 최대 10 ^ 20까지 값을 저장할 수있는 것은 아닙니다.

[...]이 선택적 표시 너비는 응용 프로그램에서 공백으로 왼쪽 여백하여 열에 지정된 너비보다 작은 너비를 갖는 정수 값을 표시하는 데 사용될 수 있습니다. ...

표시 너비는 열에 저장할 수있는 값의 범위 나 열에 지정된 너비를 초과하는 값에 대해 표시되는 자릿수를 제한하지 않습니다. 예를 들어, SMALLINT (3)으로 지정된 열의 일반적인 SMALLINT 범위는 -32768에서 32767 사이이며 세 문자가 허용하는 범위를 벗어난 값은 세 개 이상의 문자를 사용하여 표시됩니다.

각 MySQL 데이터 유형에 저장할 수있는 최대 값 및 최소값 목록은 여기를 참조 하십시오 .


18

인용문 :

"BIGINT (20)"사양은 숫자 제한이 아닙니다. 데이터가 표시 될 때 20 자리 미만을 사용하면 0으로 채워집니다. 2 ^ 64는 BIGINT 유형의 하드 한계이며 20 자리 자체를 가지고 있으므로 BIGINT (20)은 10 ^ 20 미만의 모든 항목에 공백이 표시되어 있음을 의미합니다.


3
2 ^ 64 (부호없는)는 실제로 21 자리입니다. BIGINT (20)는 위험합니다. 그것을 사용하는 사람들은 2 ^ 64가 20 개의 20 진수에 적합하다는 생각에서 사용법을 정당화하는 것 같습니다. 이 경우 왜 너비 제한을 지정해야합니까? 결과적으로, 그것은 또한 정확하지 않습니다. 2 ^ 64를 올바르게 표시하려면 21 자리가 필요합니다.
Heath Hunnicutt

@HeathHunnicutt 실수하지 않는 한, 2 ^ 64 = 18446744073709551616, 이는 20 자리 숫자입니다. 21이 무엇이라고 말합니까?
drmercer

3

내가 아는 한, 범위를 벗어난 값을 삽입하려고 할 때 작은 차이가 있습니다.

예제에서 내가 사용하는 것 401421228216인, 101110101110110100100011101100010111000(길이 39 자)

  • INT(20)시스템이 있다면 최소 20 비트를 메모리에 할당 해야 합니다. 그러나보다 큰 값을 삽입하면 값이 (또는 for ) 2^20보다 작은 경우에만 성공적으로 저장됩니다.INT(32) -> 21474836472 * INT(32) -> 4294967295UNSIGNED

예:

mysql> describe `test`;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(20) unsigned | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
1 row in set (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
ERROR 1264 (22003): Out of range value for column 'id' at row 1

mysql> SET sql_mode = '';
Query OK, 0 rows affected, 1 warning (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected, 1 warning (0,06 sec)

mysql> SELECT * FROM `test`;
+------------+
| id         |
+------------+
| 4294967295 |
+------------+
1 row in set (0,00 sec)
  • BIGINT(20)시스템이 있다면 최소 20 비트를 메모리에 할당 해야 합니다. 하지만 값을 삽입합니다 경우보다 더 큰 2^20이 적은 다음의 경우,이 성공적으로 저장됩니다 BIGINT(64) -> 9223372036854775807(또는 2 * BIGINT(64) -> 18446744073709551615에 대한 UNSIGNED)

예:

mysql> describe `test`;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| id    | bigint(20) unsigned | YES  |     | NULL    |       |
+-------+---------------------+------+-----+---------+-------+
1 row in set (0,00 sec)

mysql> INSERT INTO `test` (`id`) VALUES (401421228216);
Query OK, 1 row affected (0,04 sec)

mysql> SELECT * FROM `test`;
+--------------+
| id           |
+--------------+
| 401421228216 |
+--------------+
1 row in set (0,00 sec)

1

902054990011312와 같이 실제로 큰 수를 저장하는 경우 INT(20)와 의 차이점을 쉽게 볼 수 있습니다 BIGINT(20). 에 저장하는 것이 좋습니다 BIGINT.


1

0으로 채워진 키워드가있는 int (10) 하나에 대한 예를 들어 보자.

create table tb_test_int_type(
    int_10 int(10),
    int_10_with_zf int(10) zerofill,
    unit int unsigned
);

몇 가지 데이터를 삽입하자 :

insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647) 
;

그때

select * from tb_test_int_type; 

# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'

우리는 그것을 볼 수 있습니다

  • 키워드로 zerofill, 납입 미만 (10)는 0을 작성하지만 것 없이는 zerofill그것을하지 않습니다

  • 둘째, 키워드를 사용 zerofill하면 int_10_with_zf는 부호없는 int 유형이됩니다 Out of range value for column...... 빼기를 삽입하면 error가 발생 합니다. 그러나 int_10에 빼기를 삽입 할 수 있습니다. 또한 4294967291을 int_10에 삽입하면 오류가 발생합니다Out of range value for column.....

결론:

  1. 키워드없는 int (X) zerofill는 int 범위 -2147483648 ~ 2147483647과 같습니다.

  2. 키워드 zerofill가있는 int (X) , 필드는 부호없는 int 범위 0 ~ 4294967295와 같습니다. 숫자의 길이가 X보다 작 으면 왼쪽에 0을 채 웁니다

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.