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

MySQL UNSIGNED 컬럼에 음수 값 삽입 시 발생하는 현상과 해결 방법

MySQL UNSIGNED 컬럼에 음수 값을 넣으면 어떻게 될까?

MySQL에서 UNSIGNED로 선언된 컬럼은 0 이상의 양수만 저장할 수 있습니다. 따라서 이러한 컬럼에 음수 값을 삽입하려고 하면 에러가 발생합니다.

먼저 UNSIGNED 필드를 가진 테이블을 생성해 보겠습니다.

mysql> create table UnsignedDemo
    -> (
    -> Id int UNSIGNED
    -> );
Query OK, 0 rows affected (0.79 sec)

음수 값 삽입 시 발생하는 에러

UNSIGNED로 선언된 Id 컬럼에 음수 값을 삽입하면 다음과 같은 오류 메시지가 출력됩니다.

mysql> INSERT INTO UnsignedDemo VALUES(-100);
ERROR 1264 (22003): Out of range value for column 'Id' at row 1

ERROR 1264 (Out of range value)는 입력하려는 값이 컬럼에 허용된 범위를 벗어났다는 의미입니다. UNSIGNED 타입은 음수를 허용하지 않기 때문에 -100 같은 값은 저장할 수 없습니다.

양수 값은 정상적으로 삽입됩니다

반면 양수 값은 아무 문제 없이 저장됩니다. INSERT 명령을 사용해 위 테이블에 여러 레코드를 삽입해 보겠습니다.

mysql> INSERT INTO UnsignedDemo VALUES(100);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO UnsignedDemo VALUES(1000);
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO UnsignedDemo VALUES(0);
Query OK, 1 row affected (0.11 sec)
mysql> INSERT INTO UnsignedDemo VALUES(100000000);
Query OK, 1 row affected (0.27 sec)

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

mysql> SELECT * FROM UnsignedDemo;

출력 결과

+-----------+
| Id        |
+-----------+
|       100 |
|      1000 |
|         0 |
| 100000000 |
+-----------+
4 rows in set (0.00 sec)

정리

  • UNSIGNED 컬럼에는 0과 양수만 저장할 수 있으며, 그 범위는 일반 SIGNED 타입보다 두 배 넓습니다(예: INT UNSIGNED는 0 ~ 4,294,967,295).
  • 음수 값을 삽입하면 ERROR 1264 (Out of range value)가 발생하고 삽입에 실패합니다.
  • 참고로 MySQL 설정에 따라 strict 모드가 비활성화되어 있으면 에러 대신 값이 0으로 잘려 들어갈(warning 발생) 수도 있으므로, 데이터 무결성을 위해 strict 모드 사용을 권장합니다.

따라서 음수 값이 필요 없는 숫자 컬럼(예: 나이, 재고 수량 등)에 UNSIGNED를 사용하면 저장 범위를 효율적으로 활용할 수 있지만, 음수 입력 가능성이 있다면 SIGNED 타입을 사용하는 것이 안전합니다.