Loading...
MySQL 9.5 Reference Manual 9.5의 14.25.3 Expression Handling의 한국어 번역본입니다.
아래의 경우에 피드백에서 신고해주신다면 반영하겠습니다.
감사합니다 :)
precision math에서는 가능한 경우 항상 주어진 그대로의 exact-value number를 사용합니다. 예를 들어, 비교에서 사용되는 number는 값 변경 없이 주어진 그대로 사용됩니다. strict SQL mode에서는 exact data type(DECIMAL 또는 integer)을 가진 column에 대한 INSERT 시, number가 column range 안에 있으면 그 exact value 그대로 insert됩니다. 조회할 때의 value는 insert된 값과 같아야 합니다. (strict SQL mode가 활성화되어 있지 않으면 INSERT에 대해 truncation이 허용됩니다.)
numeric expression의 처리 방식은 expression이 어떤 종류의 value를 포함하는지에 따라 달라집니다:
approximate value가 하나라도 존재하면 expression은 approximate로 간주되며, 부동 소수점 산술을 사용하여 평가됩니다.
approximate value가 전혀 없으면 expression은 exact value만을 포함합니다. exact value 중 하나라도 fractional part(소수점 뒤의 값)를 포함하면 expression은 DECIMAL 정확한 산술을 사용하여 평가되며 precision은 65 digits입니다. “exact”라는 용어는 binary로 표현 가능한 한계에 의해 제약을 받습니다. 예를 들어 1.0/3.0은 decimal 표기에서 .333...으로 근사할 수 있지만, exact number로 쓸 수는 없으므로 (1.0/3.0)*3.0은 정확히 1.0으로 평가되지 않습니다.
그렇지 않은 경우, expression은 integer value만을 포함합니다. expression은 exact이며 정수 산술을 사용하여 평가되고 precision은 BIGINT (64 bits)와 동일합니다.
numeric expression에 string이 하나라도 포함되어 있으면, 해당 string은 배정밀도 부동 소수점 값으로 변환되며 expression은 approximate가 됩니다.
numeric column으로 insert할 때는 SQL mode의 영향을 받으며, 이는 sql_mode system variable로 제어합니다. (Section 7.1.11, “Server SQL Modes”를 참조하십시오.) 다음 설명에서는 strict mode(STRICT_ALL_TABLES 또는 STRICT_TRANS_TABLES mode value로 선택됨)와 ERROR_FOR_DIVISION_BY_ZERO를 언급합니다. 모든 restriction을 켜려면, strict mode value와 ERROR_FOR_DIVISION_BY_ZERO를 모두 포함하는 TRADITIONAL mode를 간단히 사용하면 됩니다:
1SET sql_mode='TRADITIONAL';
number가 exact type column(DECIMAL 또는 integer)에 insert되는 경우, column range와 precision 안에 있다면 그 exact value 그대로 insert됩니다.
value의 fractional part에 digit가 너무 많으면 rounding이 발생하고 note가 생성됩니다. rounding은 Section 14.25.4, “Rounding Behavior”에 설명된 대로 수행됩니다. fractional part의 rounding으로 인한 truncation은 strict mode에서도 error가 아닙니다.
value의 integer part에 digit가 너무 많으면, value가 너무 크다는(out of range) 의미이며 다음과 같이 처리됩니다:
strict mode가 활성화되어 있지 않으면, value는 가장 가까운 legal value로 잘리고 warning이 생성됩니다.
strict mode가 활성화되어 있으면 overflow error가 발생합니다.
언더플로는 검출되지 않으므로, 언더플로 처리 방식은 정의되어 있지 않습니다.
numeric column에 string을 insert할 때, string에 nonnumeric 내용이 있으면 string에서 number로의 conversion은 다음과 같이 처리됩니다:
number로 시작하지 않는 string은 number로 사용할 수 없으며 strict mode에서는 error를, 그 외에는 warning을 발생시킵니다. 여기에는 empty string도 포함됩니다.
number로 시작하는 string은 변환 가능하지만, 뒤따르는 nonnumeric 부분은 잘립니다. 잘려 나간 부분에 공백 이외의 것이 포함되어 있으면 strict mode에서는 error, 그 외에는 warning이 발생합니다.
기본적으로, division by zero는 결과를 NULL로 만들고 warning은 발생시키지 않습니다. SQL mode를 적절히 설정하면 division by zero를 제한할 수 있습니다.
ERROR_FOR_DIVISION_BY_ZERO SQL mode가 활성화되어 있을 때, MySQL은 division by zero를 다르게 처리합니다:
strict mode가 활성화되어 있지 않으면 warning이 발생합니다.
strict mode가 활성화되어 있으면, division by zero가 포함된 insert와 update는 금지되며 error가 발생합니다.
다시 말해, division by zero를 수행하는 expression이 포함된 insert와 update를 error로 처리할 수 있지만, 이를 위해서는 strict mode에 더해 ERROR_FOR_DIVISION_BY_ZERO가 필요합니다.
다음과 같은 statement가 있다고 가정합니다:
1INSERT INTO t SET i = 1/0;
strict mode와 ERROR_FOR_DIVISION_BY_ZERO mode 조합에 대해 다음과 같은 일이 발생합니다.
sql_mode Value | Result |
|---|---|
'' (Default) | warning 없음, error 없음; i는<br> NULL로 설정됩니다. |
| strict | warning 없음, error 없음; i는<br> NULL로 설정됩니다. |
ERROR_FOR_DIVISION_BY_ZERO | warning, error 없음; i는<br> NULL로 설정됩니다. |
strict, ERROR_FOR_DIVISION_BY_ZERO | error condition; row가 insert되지 않습니다. |
14.25.2 DECIMAL Data Type Characteristics
14.25.4 Rounding Behavior