MySQL에서 UNSIGNED의 의미
MySQL에서 UNSIGNED는 데이터 타입의 속성으로, 컬럼에 이 속성을 지정하면 해당 컬럼에는 음수를 저장할 수 없습니다. 대신 그만큼 양수 표현 범위가 넓어지기 때문에 매우 큰 숫자를 다뤄야 할 때 유용하게 사용할 수 있습니다.
예를 들어 일반 INT 타입의 최대값은 2147483647이지만, UNSIGNED를 적용하면 최대 4294967295까지 저장할 수 있습니다.
참고: 음수 값을 삽입하려고 하면 MySQL 오류가 발생합니다.
UNSIGNED 컬럼 생성 예제
실제 예제를 통해 UNSIGNED 타입을 확인해 보겠습니다. 먼저 UNSIGNED 컬럼을 가진 테이블을 생성합니다.
mysql> create table UnsignedDemoWithPositiveValue -> ( -> Distance int unsigned -> ); Query OK, 0 rows affected (0.86 sec)
범위를 초과하는 값 삽입 시 오류 발생
UNSIGNED INT의 최대 범위인 4294967295보다 큰 값인 4294967296을 삽입하면 값이 범위를 벗어나므로 오류가 발생합니다.
mysql> insert into UnsignedDemoWithPositiveValue values(4294967296); ERROR 1264 (22003): Out of range value for column 'Distance' at row 1
위 예제에서 4294967296은 허용 범위를 초과했기 때문에 오류가 발생한 것입니다.
이번에는 허용되는 최대값인 4294967295를 삽입해 보겠습니다.
mysql> insert into UnsignedDemoWithPositiveValue values(4294967295); Query OK, 1 row affected (0.30 sec)
위와 같이 쿼리가 성공적으로 실행된 것을 확인할 수 있습니다.
음수 삽입 시 오류 발생
또 다른 예제로, 음수 값을 삽입하면 어떻게 되는지 살펴보겠습니다. UNSIGNED 컬럼에 음수 레코드를 삽입하면 다음과 같은 오류가 발생합니다.
mysql> insert into UnsignedDemoWithPositiveValue values(-124); ERROR 1264 (22003): Out of range value for column 'Distance' at row 1
이번에는 정상적인 양수 값인 124를 삽입해 보겠습니다.
mysql> insert into UnsignedDemoWithPositiveValue values(124); Query OK, 1 row affected (0.86 sec)
역시 쿼리가 성공적으로 실행된 것을 볼 수 있습니다.
저장된 데이터 확인하기
SELECT 문을 사용하여 저장된 레코드를 조회해 보겠습니다.
mysql> select *from UnsignedDemoWithPositiveValue;
실행 결과는 다음과 같습니다.
+------------+ | Distance | +------------+ | 4294967295 | | 124 | +------------+ 2 rows in set (0.00 sec)
정리: UNSIGNED를 언제 사용해야 할까?
UNSIGNED는 나이, 거리, 재고 수량 등 음수가 될 수 없는 값을 저장하는 컬럼에 적합합니다. 이렇게 하면 잘못된 음수 데이터 입력을 데이터베이스 차원에서 방지할 수 있고, 동일한 바이트 수로 더 넓은 양수 범위를 활용할 수 있다는 장점이 있습니다. 반면 뺄셈 연산 결과가 음수가 될 가능성이 있는 경우에는 오히려 오류를 유발할 수 있으므로 주의해서 사용해야 합니다.