• 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)
  • 12. 함수와 연산자
  • 1. 함수와 연산자 참조
    2. 식 평가 형식 변환
    3. 연산자
    4. 제어 흐름 함수
    5. 문자열 함수
    6. 수치 함수와 연산자
    7. 날짜 및 시간 함수
    8. MySQL에서 사용되는 달력
    9. Full-Text 검색 기능
    10. 캐스트 함수와 연산자
    11. XML 함수
    12. 비트 함수
    13. 암호화 함수와 압축 함수
    14. 정보 함수
    15. 공간 분석 함수
    16. 글로벌 트랜잭션 ID와 함께 사용되는 함수
    17. MySQL Enterprise Encryption 기능
    18. 기타 함수
    19. GROUP BY 절에서 사용되는 함수와 수식
    20. 정밀 계산
    1. 숫자 형태
    2. DECIMAL 데이터 유형의 특성
    3. 식의 처리
    4. 둥근 동작
    5. 정밀 계산의 예
  • 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 새로운 기능

12.20.3 식의 처리

정밀 계산은 가능하면 항상 엄격 값 수치는 주어진대로 사용됩니다. 예를 들어, 비교 수치는 값을 변경하지 않고 정확하게 지정된대로 사용됩니다. 엄격한 SQL 모드에서 정확한 값 데이터 유형 ( DECIMAL 또는 정수)을 가지는 컬럼에 INSERT 의 경우, 수치의 정확한 값이 컬럼의 범위 내에 있으면, 그 수치가 정확한 값으로 삽입됩니다. 취득되면, 그 값은 삽입 된 값과 동일해야합니다. (엄격한 SQL 모드가 활성화되어 있지 않은 경우는 INSERT 에서 잘림이 허용됩니다.)

숫자 식의 처리는 그 표현에 어떤 종류의 값이 포함되어 있는지에 따라 다릅니다.

  • 근사치가 존재하는 경우, 그 표현은 근사치이기 때문에 부동 소수점 연산을 사용하여 평가됩니다.

  • 근사치가 존재하지 않는 경우, 그 식은 엄격한 값 만 포함되어 있습니다. 하나의 정확한 값에 소수 (소수점에 오는 값)가 포함되어있는 경우, 그 수식은 DECIMAL 정확한 연산을 사용하여 평가 정밀도는 65 자리입니다. "정확한"라는 용어는 바이너리로 표현할 수있는 정도의 제한을 따릅니다. 예를 들어, 1.0/3.0 는 10 진법으로 .333... 와 거의 유사하지만 엄밀히 값 수치로 설명되지 않기 때문에 (1.0/3.0)*3.0 은 정확히 1.0 으로 계산되지 않습니다.

  • 그렇지 않으면 수식은 정수 값 만 포함되어 있습니다. 그 식은 엄격한 값이고, 정수 연산을 사용하여 평가 된 정확도는 BIGINT (64 비트)와 동일합니다.

숫자 식에 문자열이 포함되어있는 경우, 그 문자열은 배정 밀도 부동 소수점 값으로 변환되고 표현식은 근사치입니다.

수치 컬럼에 삽입은 sql_mode 시스템 변수에 의해 제어되는 SQL 모드에 의해 영향을받습니다. ( 섹션 5.1.7 "서버 SQL 모드" 를 참조하십시오.) 다음의 설명에서는 엄격 모드 ( STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES 모드 값에 따라 선택됩니다) 및 ERROR_FOR_DIVISION_BY_ZERO 에 대해 다루고 있습니다. 모든 제한을 설정하려면 단순히 엄격 모드 값과 ERROR_FOR_DIVISION_BY_ZERO 을 모두 포함 TRADITIONAL 모드를 사용할 수 있습니다.

 mysql> SET sql_mode='TRADITIONAL';

수치가 정확한 값 형태의 컬럼 ( DECIMAL 또는 정수)에 삽입 된 경우는 수치의 정확한 값이 컬럼의 범위 내에 있으면, 그 수치가 정확한 값으로 삽입됩니다.

그 값의 소수부에 포함되어있는 자리가 너무 많은 경우는 반올림이 발생 경고가 생성됩니다. 반올림은 섹션 12.20.4 「둥근 동작」 에 설명 된대로 실행됩니다.

그 값의 정수 부분에 포함되어있는 자리가 너무 많은 경우는 그 값이 너무 크기 때문에 다음과 같이 처리됩니다.

  • 엄격 모드가 활성화되어 있지 않은 경우는 그 값이 가장 가까운 정당한 값에 잘리고 경고가 생성됩니다.

  • 엄격 모드가 활성화되어 있으면 오버플로 오류가 발생합니다.

언더 플로우는 검출되지 않기 때문에 언더 플로우의 처리는 정의되어 있지 않습니다.

수치 컬럼에 문자열 삽입은 문자열에 숫자가 아닌 내용이 포함되어있는 경우 문자열에서 숫자로 변환은 다음과 같이 처리됩니다.

  • 숫자로 시작하지 않는 문자열을 숫자로 사용 할 수 없기 때문에,이 캐릭터 라인에 의해 엄격 모드에서 오류가 생성되고, 그렇지 않으면 경고가 생성됩니다. 여기에는 빈 문자열이 포함됩니다.

  • 숫자로 시작하는 문자열은 변환 할 수 있지만 후속 숫자가 아닌 부분은 잘립니다. 그 잘린 부분에 공백이 아닌 문자가 포함되어있는 경우 엄격 모드에서 오류가 생성되고, 그렇지 않으면 경고가 생성됩니다.

기본적으로 0으로 나눠서 NULL 결과가 생성 된 경고가 생성되지 않습니다. SQL 모드를 적절하게 설정하여 0으로 나누기를 제한 할 수 있습니다.

ERROR_FOR_DIVISION_BY_ZERO SQL 모드가 활성화되어있는 경우, MySQL은 0으로 나누기를 다음 다른 방법으로 처리합니다.

  • 엄격 모드가 활성화되어 있지 않은 경우 경고가 발생합니다.

  • 엄격 모드가 활성화되어있는 경우는 0으로 나누기를 포함 삽입 및 업데이트가 금지되어 오류가 발생합니다.

즉, 0으로 나누기를 수행하는 수식을 포함 삽입 및 업데이트 오류로 처리 할 수 있지만, 거기에는 엄격 모드 이외에 ERROR_FOR_DIVISION_BY_ZERO 가 필요합니다.

다음 문이 있다고합니다.

 INSERT INTO t SET i = 1/0;

다음 엄격 모드와 ERROR_FOR_DIVISION_BY_ZERO 모드의 각 조합에 대한 동작을 보여줍니다.

sql_mode 값 결과
'' (기본) 경고없이 오류없이. i 는 NULL 로 설정됩니다.
엄격 경고없이 오류없이. i 는 NULL 로 설정됩니다.
ERROR_FOR_DIVISION_BY_ZERO 경고가 오류없이. i 는 NULL 로 설정됩니다.
준엄 ERROR_FOR_DIVISION_BY_ZERO 오류 상태. 행은 삽입되지 않습니다.


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