Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL에서 BIGINT의 SIGNED와 UNSIGNED 이해하기

MySQL에서 컬럼을 정의할 때 UNSIGNED 옵션을 지정하지 않으면 BIGINT는 기본적으로 SIGNED(부호 있음) 타입으로 생성됩니다. 반대로 UNSIGNED를 명시하면 해당 컬럼은 UNSIGNED(부호 없음) 타입이 되어 음수 값을 저장할 수 없습니다.

두 타입이 저장할 수 있는 값의 범위는 다음과 같습니다.

  • SIGNED BIGINT: -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
  • UNSIGNED BIGINT: 0 ~ 18,446,744,073,709,551,615

테이블 생성 예제

먼저 SIGNED와 UNSIGNED BIGINT 컬럼을 각각 가진 테이블을 생성해 보겠습니다.

mysql> create table DemoTable
    (
    Number bigint, // signed
    Number2 bigint unsigned // unsigned
    );
Query OK, 0 rows affected (1.08 sec)

INSERT 문을 사용하여 테이블에 레코드를 삽입합니다.

mysql> insert into DemoTable values(18446744073709551615,18446744073709551615);
ERROR 1264 (22003): Out of range value for column 'Number' at row 1
mysql> insert into DemoTable values(9223372036854775807,18446744073709551615);
Query OK, 1 row affected (0.28 sec)

첫 번째 INSERT 문은 SIGNED 컬럼인 Number에 UNSIGNED의 최대값(18,446,744,073,709,551,615)을 저장하려고 했기 때문에 범위 초과(out of range) 오류가 발생합니다. 반면 두 번째 INSERT 문은 SIGNED의 최대값(9,223,372,036,854,775,807)과 UNSIGNED의 최대값을 각각 저장하므로 정상적으로 처리됩니다.

SELECT 문으로 테이블의 모든 레코드를 조회해 보겠습니다.

mysql> select * from DemoTable;

실행 결과는 다음과 같습니다.

+---------------------+----------------------+
| Number | Number2 |
+---------------------+----------------------+
| 9223372036854775807 | 18446744073709551615 |
+---------------------+----------------------+
1 row in set (0.00 sec)

결과에서 확인할 수 있듯이, SIGNED 컬럼에는 최대 9,223,372,036,854,775,807까지 저장되는 반면, UNSIGNED 컬럼에는 약 두 배에 해당하는 18,446,744,073,709,551,615까지 저장될 수 있습니다. 따라서 매우 큰 양수 값을 다루어야 하는 경우에는 UNSIGNED 옵션을 활용하는 것이 좋습니다.