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 | 오류 상태. 행은 삽입되지 않습니다. |