11.2.6 범위 및 오버플로 처리
MySQL은 컬럼 데이터 형의 허용 가능한 범위를 벗어난 수치 컬럼에 값을 저장하면 결과는 그 시점에서 유효한 SQL 모드에 따라 다릅니다.
엄격한 SQL 모드가 활성화되면 SQL 표준에 따라, MySQL은 범위 밖의 값을 거부하고 오류를 표시하고 삽입은 실패합니다.
제한적인 모드가 활성화되어 있지 않은 경우, MySQL은 범위의 적절한 종점에 값을 잘라 그 결과 값을 대신 저장합니다.
범위 밖의 값이 정수 컬럼에 할당되면 MySQL은 컬럼 데이터 형의 범위에 해당하는 종점을 나타내는 값을 저장합니다.
TINYINT
또는TINYINT UNSIGNED
컬럼에 256을 저장하면, MySQL은 각각 127 또는 255를 포함합니다.부동 소수점 또는 고정 소수점 컬럼에 지정된 (또는 기본) 정밀도와 스케일에 의해 암시 된 범위를 초과 한 값이 할당되면, MySQL은 그 범위에 해당하는 종점을 나타내는 값을 저장합니다.
MySQL이 엄격 모드에서 작동하지 않을 때 잘라 때문에 일어나는 컬럼 지정 변환은 ALTER TABLE
, LOAD DATA INFILE
, UPDATE
및 여러 행 INSERT
문에 대한 경고로보고됩니다. 엄격 모드에서는 이러한 문은 실패하고 테이블이 트랜잭션 테이블 여부 및 기타 요인에 따라 일부 또는 모든 값을 삽입하거나 변경하지 않습니다. 자세한 내용은 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.
MySQL 5.6에서는 숫자 식 평가 중 오버플로 오류가 발생합니다. 예를 들어, 부호화 된 BIGINT
의 최대 값은 9223372036854775807이므로 다음 식에 오류가 발생합니다.
mysql> SELECT 9223372036854775807 + 1;
ERROR 1690 (22003) : BIGINT value is out of range in '(9223372036854775807 + 1)'
이 경우 연산을 성공 시키려면 값을 부호로 변환합니다.
mysql> SELECT CAST(9223372036854775807 AS UNSIGNED) + 1;
+-------------------------------------------+
| CAST(9223372036854775807 AS UNSIGNED) + 1 |
+-------------------------------------------+
| 9223372036854775808 |
+-------------------------------------------+
오버 플로우가 발생하는지는 피연산자의 범위에 따라 다릅니다. 따라서 위의 식을 처리하는 또 하나의 방법으로 DECIMAL
값에 정수보다 큰 범위가 있기 때문에 정확한 값의 연산을 사용합니다.
mysql> SELECT 9223372036854775807.0 + 1;
+---------------------------+
| 9223372036854775807.0 + 1 |
+---------------------------+
| 9223372036854775808.0 |
+---------------------------+
한편이 UNSIGNED
형의 경우 2 개의 정수 값 사이에서 뺄셈을 할 때 기본적으로 부호없는 결과가 생성됩니다. MySQL 5.5.5 이전에서는 그렇지에서는 결과가 음수가되어 있었을 경우, 최대 정수 값입니다.
mysql>SET sql_mode = '';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+---------------------------+ | CAST (0 AS UNSIGNED) - 1 | +---------------------------+ | 18446744073709551615 | +---------------------------+
MySQL 5.5.5 이후에서는 그렇지에서는 결과가 음수가되어 있었을 경우, 오류가 발생합니다.
mysql>SET sql_mode = '';
Query OK, 0 rows affected (0.00 sec) mysql>SELECT CAST(0 AS UNSIGNED) - 1;
ERROR 1690 (22003) : BIGINT UNSIGNED value is out of range in '(cast (0 as unsigned) - 1)'
NO_UNSIGNED_SUBTRACTION
SQL 모드가 활성화되어있는 경우, 결과는 음수가됩니다.
mysql>SET sql_mode = 'NO_UNSIGNED_SUBTRACTION';
mysql>SELECT CAST(0 AS UNSIGNED) - 1;
+-------------------------+ | CAST(0 AS UNSIGNED) - 1 | +-------------------------+ | -1 | +-------------------------+
이러한 연산의 결과를 사용하여 UNSIGNED
정수 컬럼이 업데이트되면 결과는 그 컬럼 형의 최대 값으로 잘려 있습니다. NO_UNSIGNED_SUBTRACTION
이 활성화되어있는 경우는 0으로 잘려 있습니다. 엄격한 SQL 모드가 활성화되어있는 경우 오류가 발생 컬럼은 바뀌지 않습니다.