source

Oracle이 데이터베이스 테이블의 행에 NaN을 추가하는 시기/이유

lovecheck 2023. 10. 19. 22:24
반응형

Oracle이 데이터베이스 테이블의 행에 NaN을 추가하는 시기/이유

NaN이 Not a Number의 약자인 것으로 알고 있습니다.하지만 Oracle이 언제, 왜 이 문제를 추가하는지 이해하기가 어렵습니다.

음수와 같이 0보다 작은 값을 만났을 때 또는 가비지 값일 때입니다.

문서에서:

Oracle Database 숫자 데이터 유형에는 정의되지 않은 작업의 결과인 양과 음의 고정 및 부동 소수점 숫자, 0, 무한대 및 값이 저장됩니다. "숫자가 아님" 또는NAN.

제가 알기로는 NaN을 binary_float 또는 binary_double 열에만 얻을 수 있습니다. 이 데이터 유형에는 NaN에 대한 자체 리터럴도 있고, 이들을 조작할 수 있는 조건도 있습니다.

이러한 값을 얻는 방법의 예는 0 플로트/더블 값을 0으로 나누는 것입니다.

select 0f/0 from dual;

0F/0
----
NaN  

... 따라서 NaN이 표시되는 경우 애플리케이션 로직이나 기본 데이터가 손상될 수 있습니다. (참고로 '정상' 숫자 유형에서는 이를 얻을 수 없습니다.ORA-01476: divisor is equal to zero분자가 부동하거나 두 배가 아닌 한).

0이나 음수는 NaN이 나오지 않습니다.문자열 열이 있고 응용 프로그램이 'NaN'이라는 단어를 입력하고 있을 수도 있지만 숫자를 문자열로 저장하는 것은 여러 수준에서 좋지 않은 생각이므로 그렇지 않기를 바랍니다.

아니요 <=0>은 여전히 숫자이므로 정확하지 않습니다.NaN(또는 무한대)은 계산할 수 없는 숫자(+- ∞ 또는 단순히 숫자가 아닌 것)를 다룰 때 DB가 제정신을 유지하기 위해 사용하는 특수한 값입니다.코드는 다음과 같습니다.

DECLARE
  l_bd_test   binary_double;
  l_int_test  INTEGER;
BEGIN
  l_bd_test   := 'NAN';
  l_int_test  := 0;
  IF l_bd_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS NAN');
  ELSE
    DBMS_OUTPUT.PUT_LINE(l_bd_test || ' IS A #');
  END IF;
  IF l_int_test IS NAN THEN 
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS NAN');
  ELSE
    DBMS_OUTPUT.PUT_LINE(l_int_test || ' IS A #');
  END IF;
END;
/

대체물NAN위해서INFINITY심지어 부정하고 결과를 볼 수도 있습니다.

언급URL : https://stackoverflow.com/questions/28461229/when-why-does-oracle-adds-nan-to-a-row-in-a-database-table

반응형