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을 참조
-
4 바이트 부호있는 정수입니다.INT
-
8 바이트 부호있는 정수입니다.BIGINT
이들은 각각의 바이트 수에 저장할 수있는 것보다 더 이상 더 적은 값을 허용하지 않습니다. 그것은의 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)
- If you have
BIGINT(20)
for system this means allocate in memory minimum 20 bits. But if you'll insert value that bigger than2^20
, it will be stored successfully, if it's less thenBIGINT(64) -> 9223372036854775807
(or2 * BIGINT(64) -> 18446744073709551615
forUNSIGNED
)
Example:
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)
I wanted to add one more point is, if you are storing a really large number like 902054990011312 then one can easily see the difference of INT(20)
and BIGINT(20)
. It is advisable to store in BIGINT
.
Let's give an example for int(10) one with zerofill keyword, one not, the table likes that:
create table tb_test_int_type(
int_10 int(10),
int_10_with_zf int(10) zerofill,
unit int unsigned
);
Let's insert some data:
insert into tb_test_int_type(int_10, int_10_with_zf, unit)
values (123456, 123456,3147483647), (123456, 4294967291,3147483647)
;
Then
select * from tb_test_int_type;
# int_10, int_10_with_zf, unit
'123456', '0000123456', '3147483647'
'123456', '4294967291', '3147483647'
We can see that
-
with keyword
zerofill
, num less than 10 will fill 0, but withoutzerofill
it won't -
Secondly with keyword
zerofill
, int_10_with_zf becomes unsigned int type, if you insert a minus you will get errorOut of range value for column.....
. But you can insert minus to int_10. Also if you insert 4294967291 to int_10 you will get errorOut of range value for column.....
Conclusion:
-
int(X) without keyword
zerofill
, is equal to int range -2147483648~2147483647 -
int(X) with keyword
zerofill
, the field is equal to unsigned int range 0~4294967295, if num's length is less than X it will fill 0 to the left
참고URL : https://stackoverflow.com/questions/3135804/types-in-mysql-bigint20-vs-int20
'programing' 카테고리의 다른 글
파이썬에서 버전 번호를 어떻게 비교합니까? (0) | 2020.05.09 |
---|---|
JAXB에 의해 생성 된 @XmlRootElement가 없습니다. (0) | 2020.05.09 |
Rails 4 진품 토큰 (0) | 2020.05.09 |
C #에서 Json 파일 읽기 및 구문 분석 (0) | 2020.05.09 |
Objective-C에서 클래스 수준 속성을 어떻게 선언합니까? (0) | 2020.05.09 |