• MySQL매뉴얼
    • MySQL 5.6 매뉴얼
    • MySQL 5.1 매뉴얼
    • MySQL 5.0 매뉴얼
    • MySQL HA 매뉴얼
  • 기술문서
    • Xtrabackup 구성
    • 메모리 사용량 모니터링
  • 라이선스
  • 온라인문의
  • 회사소개
  • → 목 록 (MySQL5.6 한글메뉴얼) [close]
  • 1. MySQL 5.6 새로운 기능
  • 2. MySQL 설치 및 업그레이드
  • 3. MySQL Tutorial
  • 4. MySQL 프로그램
  • 5. MySQL 서버관리
  • 6. 보안
  • 7. 백업 및 복구
  • 8. 최적화
  • 9. Language Structure(언어구조)
  • 10. Character Sets(Globalization)
  • 11. 데이터형(Data Types)
  • 1. 데이터 형식 요약
    2. 수치형
    1. 정수형(정확한 숫자) - INTEGER, INT, SMALLINT, TINYINT, MEDIUMINT, BIGINT
    2. 고정 소수점 형식 (정확한 숫자) - DECIMAL, NUMERIC
    3. 부동 소수점 형 (대략적인 값) - FLOAT, DOUBLE
    4. Bit-Value Type - BIT
    5. 수치 형 속성
    6. 범위 및 오버플로 처리
    3. 날짜와 시간 형
    4. 문자열
    5. 공간 데이터의 확장
    6. 데이터 형 기본값
    7. 데이터 유형의 스토리지 요구 사항
    8. 컬럼에 적절한 형태의 선택
    9. 기타 데이터베이스 엔진의 데이터 형식 사용
  • 12. 함수와 연산자
  • 13. SQL 문법
  • 14. InnoDB 스토리지 엔진
  • 15. 기타 스토리지 엔진
  • 16. 고가용성 및 확장성
  • 17. 리플리케이션
  • 18. MySQL Cluster
  • 19. 파티셔닝
  • 20. Stored Programs and Views
  • 21. INFORMATION_SCHEMA
  • 22. PERFORMANCE SCHEMA
  • 23. 컨넥터 및 API
  • 24. MySQL 확장
  • 25. MySQL Enterprise Edition
  • 26. MySQL Workbench
  • 27. 제약 및 제한
  • 28. MySQL 5.7 새로운 기능

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 모드가 활성화되어있는 경우 오류가 발생 컬럼은 바뀌지 않습니다.


서울시 강남구 영동대로 602 6층
TEL: 02-6061-0006  /  E: csr@mysqlkorea.com
주식회사 이노클러스터  등록번호 : 727-86-02261
Copyright © innocluster Co. ltd. all rights reserved