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

MySQL에서 범위를 벗어난 숫자 값을 처리하는 방법

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)가 발생하고 삽입이 실패합니다.
- 엄격 모드 비활성화 시: 값이 컬럼 타입의 최대/최소값으로 잘려 저장되며, 경고만 표시됩니다.

따라서 데이터 무결성이 중요한 애플리케이션에서는 엄격 모드를 활성화하여 잘못된 값이 조용히 잘려 저장되는 상황을 방지하는 것이 좋습니다.