MySQL에서 숫자 값이 컬럼 데이터 타입의 허용 범위를 벗어났을 때 어떻게 처리되는지는 SQL 모드 설정에 따라 달라집니다. 크게 두 가지 경우로 나눌 수 있습니다.
(A) SQL 엄격 모드(Strict Mode) 활성화 시
엄격한 SQL 모드가 활성화되어 있으면, MySQL은 범위를 벗어난 값이 입력되는 순간 오류(error)를 반환하고 해당 값의 삽입을 거부합니다. 이 경우 일부 또는 전체 값의 삽입이 실패하게 됩니다.
예를 들어, TINYINT(-128 ~ 127)와 UNSIGNED TINYINT(0 ~ 255) 타입을 가진 두 개의 컬럼으로 테이블을 생성해 보겠습니다.
mysql> Create table counting(Range1 Tinyint, Range2 Tinyint Unsigned); Query OK, 0 rows affected (0.14 sec)
다음 명령을 실행하여 엄격한 SQL 모드를 활성화할 수 있습니다.
mysql> Set SQL_MODE ='traditional'; Query OK, 0 rows affected (0.00 sec)
이제 범위를 벗어난 값(256)을 각 컬럼에 삽입하려고 하면 MySQL은 오류를 출력하고 삽입이 실패합니다. 아래 쿼리로 확인할 수 있습니다.
mysql> Insert into Counting(Range1, Range2) Values(256,256); ERROR 1264 (22003): Out of range value for column 'Range1' at row 1 mysql> Select * from counting; Empty set (0.00 sec)
오류가 발생했기 때문에 테이블에는 아무런 데이터도 저장되지 않은 것을 확인할 수 있습니다.
(B) SQL 엄격 모드 비활성화 시
반대로 엄격 모드가 비활성화되어 있으면, MySQL은 범위를 벗어난 값을 해당 컬럼 데이터 타입의 적절한 최대값(끝점)으로 잘라내어(clipping) 저장합니다. 이때 잘림으로 인해 발생한 컬럼 값 변환에 대해 경고(warning)를 함께 표시합니다.
아래 예제에서는 SQL 엄격 모드를 비활성화한 후 동일한 값(256)을 삽입해 봅니다.
mysql> Set SQL_MODE = ''; Query OK, 0 rows affected (0.00 sec) mysql> Insert Into Counting(Range1,Range2) values (256,256); Query OK, 1 row affected, 2 warnings (0.02 sec) mysql> Show Warnings; +---------+------+-------------------------------------------------+ | Level | Code | Message | +---------+------+-------------------------------------------------+ | Warning | 1264 | Out of range value for column 'Range1' at row 1 | | Warning | 1264 | Out of range value for column 'Range2' at row 1 | +---------+------+-------------------------------------------------+ 2 rows in set (0.00 sec) mysql> Select * from Counting; +--------+--------+ | Range1 | Range2 | +--------+--------+ | 127 | 255 | +--------+--------+ 1 row in set (0.00 sec)
결과를 보면, TINYINT 컬럼에는 최대값인 127이, UNSIGNED TINYINT 컬럼에는 최대값인 255가 저장되었으며, 삽입 자체는 성공했지만 두 개의 경고가 발생한 것을 확인할 수 있습니다.
정리
- 엄격 모드 활성화 시: 범위 초과 값 입력 시 오류(ERROR 1264)가 발생하고 삽입이 실패합니다.
- 엄격 모드 비활성화 시: 값이 컬럼 타입의 최대/최소값으로 잘려 저장되며, 경고만 표시됩니다.
따라서 데이터 무결성이 중요한 애플리케이션에서는 엄격 모드를 활성화하여 잘못된 값이 조용히 잘려 저장되는 상황을 방지하는 것이 좋습니다.