[mysql] MySQL의 유형 : BigInt (20) vs Int (20)
나는 그 차이 사이에 무엇을 궁금 해서요 BigInt
, MediumInt
그리고 Int
… 그들이 더 큰 숫자를 허용 것이 분명한 것 같다된다 그러나 나는 Int(20)
a 또는 a를 만들 수 있으며 BigInt(20)
그것이 반드시 크기에 관한 것은 아니라고 생각할 것입니다.
약간의 통찰력은 굉장하고 호기심이 많을 것입니다. 나는 오랫동안 MySQL 을 사용 하고 유형을 선택할 때 비즈니스 요구를 적용하려고 노력했지만이 측면을 이해하지 못했습니다.
답변
http://dev.mysql.com/doc/refman/8.0/en/numeric-types.html을 참조 하십시오
-
INT
4 바이트 부호있는 정수입니다. -
BIGINT
8 바이트 부호있는 정수입니다.
이들은 각각의 바이트 수에 저장할 수있는 것보다 더 이상 더 적은 값을 허용하지 않습니다. 그것은의 2 32 값 INT
과의 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)
. 그렇지 않다.
답변
형식 선언에서 괄호 안의 숫자는 display width입니다 . 이는 데이터 형식에 저장할 수있는 값의 범위와 관련이 없습니다. 선언 할 수 있다고 Int(20)
해서 최대 10 ^ 20까지 값을 저장할 수있는 것은 아닙니다.
[…]이 선택적 표시 너비는 응용 프로그램에서 공백으로 왼쪽 여백하여 열에 지정된 너비보다 작은 너비를 갖는 정수 값을 표시하는 데 사용될 수 있습니다. …
표시 너비는 열에 저장할 수있는 값의 범위 나 열에 지정된 너비를 초과하는 값에 대해 표시되는 자릿수를 제한하지 않습니다. 예를 들어, SMALLINT (3)으로 지정된 열의 일반적인 SMALLINT 범위는 -32768에서 32767 사이이며 세 문자가 허용하는 범위를 벗어난 값은 세 개 이상의 문자를 사용하여 표시됩니다.
각 MySQL 데이터 유형에 저장할 수있는 최대 값 및 최소값 목록은 여기를 참조 하십시오 .
답변
인용문 :
“BIGINT (20)”사양은 숫자 제한이 아닙니다. 데이터가 표시 될 때 20 자리 미만을 사용하면 0으로 채워집니다. 2 ^ 64는 BIGINT 유형의 하드 한계이며 20 자리 자체를 가지고 있으므로 BIGINT (20)은 10 ^ 20 미만의 모든 항목에 공백이 표시되어 있음을 의미합니다.
답변
내가 아는 한, 범위를 벗어난 값을 삽입하려고 할 때 작은 차이가 있습니다.
예제에서 내가 사용하는 것
401421228216
인,101110101110110100100011101100010111000
(길이 39 자)
INT(20)
시스템이 있다면 최소 20 비트를 메모리에 할당 해야 합니다. 그러나보다 큰 값을 삽입하면 값이 (또는 for )2^20
보다 작은 경우에만 성공적으로 저장됩니다.INT(32) -> 2147483647
2 * INT(32) -> 4294967295
UNSIGNED
예:
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)
답변
902054990011312와 같이 실제로 큰 수를 저장하는 경우 INT(20)
와 의 차이점을 쉽게 볼 수 있습니다 BIGINT(20)
. 에 저장하는 것이 좋습니다 BIGINT
.
답변
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.....
결론:
-
키워드없는 int (X)
zerofill
는 int 범위 -2147483648 ~ 2147483647과 같습니다. -
키워드
zerofill
가있는 int (X) , 필드는 부호없는 int 범위 0 ~ 4294967295와 같습니다. 숫자의 길이가 X보다 작 으면 왼쪽에 0을 채 웁니다