문제

나는 그것을 알고있다 하다 로 생각하다 NULL, 그러나 그것은 나에게 말하는 것이별로 많지 않습니다 이것이 그 경우 다. SQL 사양을 이해하면서 ''는 다음과 같지 않습니다. NULL - 하나는 유효한 데이텀이고, 다른 하나는 동일한 정보가 없음을 나타냅니다.

자유롭게 추측하십시오. 그러나 그것이 사실인지 표시하십시오. Oracle의 누군가가 그것에 대해 언급 할 수있는 사람이 있다면 그것은 환상적 일 것입니다!

도움이 되었습니까?

해결책

나는 대답은 오라클이 아주 아주 오래되었다고 믿는다.

SQL 표준이 있기 전 옛날에 Oracle은 비어있는 문자열이 VARCHAR/VARCHAR2 열이었다 NULL 그리고 널 감각이 하나만있었습니다 (신속하지 않은 데이터를 구별하는 관계형 이론가, 답변이 존재하지만 사용자가 알려지지 않은 데이터, 답변이없는 데이터 등의 데이터 등이 있습니다. 어떤 감각을 구성합니다 NULL).

SQL 표준이 돌아와서 NULL 빈 문자열은 별개의 엔티티였으며 이미 두 가지가 동등하다고 가정 한 코드가있는 Oracle 사용자가있었습니다. 따라서 Oracle은 기본적으로 기존 코드를 위반하거나 SQL 표준을 위반하거나 잠재적으로 많은 수의 쿼리 기능을 변경하는 일종의 초기화 매개 변수를 도입하는 옵션을 남겼습니다. SQL 표준 (IMHO)을 위반하는 것은이 세 가지 옵션 중 가장 파괴적인 것입니다.

오라클은 VARCHAR 데이터 유형은 향후 릴리스에서 변경하여 SQL 표준을 준수합니다 (모든 사람이 사용하는 이유입니다. VARCHAR2 Oracle에서 해당 데이터 유형의 동작은 앞으로도 동일하게 유지됩니다).

다른 팁

Tom Kyte 오라클 부사장 :

제로 길이의 바르 차는 널로 취급됩니다.

`` '는 널로 취급되지 않습니다.

``char에 할당되면 (1)가됩니다.

``varchar2에 할당되면 (1)은`` '가됩니다.``제로 길이 문자열이고 제로 길이 문자열이 Oracle에서는 null입니다 (더 길지 않음').

Oracle을 이전 개발자가했던 방식으로 생각하면 데이터 입력 시스템의 영광스러운 백엔드로 이것이 훨씬 더 의미가 있다고 생각합니다. 데이터베이스의 모든 필드는 데이터 입력 연산자가 화면에서 본 형태의 필드에 해당했습니다. 연산자가 필드에 아무것도 입력하지 않은 경우, "생년월일"또는 "주소"이든 해당 필드의 데이터는 "알 수 없음"입니다. 운영자가 누군가의 주소가 실제로 빈 문자열이라는 것을 나타내는 방법은 없으며, 어쨌든 실제로는 의미가 없습니다.

Oracle Documentation은 최소한 버전 7 까지이 문제를 개발자에게 경고합니다.

Oracle은 "불가능한 가치"기술로 널을 대표하기로 결정했습니다. 예를 들어, 숫자 위치의 널은 불가능한 값인 "마이너스 0"으로 저장됩니다. 계산으로 인한 마이너스 제로는 저장되기 전에 양수 0으로 변환됩니다.

Oracle은 또한 잘못된 길이 0의 바르 차 문자열 (빈 문자열)을 불가능한 값으로 간주하고 NULL을 나타내는 데 적합한 선택을 선택했습니다. 빈 문자열은 불가능한 가치와는 거리가 멀다는 것이 밝혀졌습니다. 문자열 연결 작업하에 정체성이기도합니다!

Oracle Documentation은 데이터베이스 디자이너와 개발자에게 미래 버전의 Oracle이 빈 문자열과 NULL 사이의 이러한 연관성을 중단하고 해당 협회에 의존하는 모든 코드를 깨뜨릴 수 있다고 경고합니다.

불가능한 값 이외의 널을 플래그하는 기술이 있지만 Oracle은 사용하지 않았습니다.

(위의 "위치"라는 단어를 사용하여 행과 열의 교차점을 의미합니다.)

빈 문자열은 두 가지 (빈 문자열과 널)가 같지 않은 상황과 비교할 때 "더 적은 악"이기 때문에 단순히 널과 동일합니다.

NULL과 빈 문자열이 동일하지 않은 언어에서는 항상 두 조건을 항상 확인해야합니다.

공식 11G 문서에 따르면

Oracle Database는 현재 0의 길이의 문자 값을 null로 취급합니다. 그러나 이것은 향후 릴리스에서 계속해서 사실이 아닐 수 있으며 Oracle은 빈 줄을 널과 동일하게 처리하지 않는 것이 좋습니다.

가능한 이유

  1. val IS NOT NULL 보다 읽기 쉽습니다 val != ''
  2. 두 조건을 모두 확인할 필요가 없습니다 val != '' and val IS NOT NULL

책의 예

   set serveroutput on;   
    DECLARE
    empty_varchar2 VARCHAR2(10) := '';
    empty_char CHAR(10) := '';
    BEGIN
    IF empty_varchar2 IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_varchar2 is NULL');
    END IF;


    IF '' IS NULL THEN
    DBMS_OUTPUT.PUT_LINE(''''' is NULL');
    END IF;

    IF empty_char IS NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NULL');
    ELSIF empty_char IS NOT NULL THEN
    DBMS_OUTPUT.PUT_LINE('empty_char is NOT NULL');
    END IF;

    END;

널로 취급하지 않는 것도 특히 도움이되지 않기 때문입니다.

이 지역에서 Oracle의 실수를 저지르면 일반적으로 즉시 알 수 있습니다. 그러나 SQL Server에서는 작동하는 것처럼 보이며 누군가가 NULL 대신 빈 문자열에 들어가면 문제가 나타납니다 (아마도 NULL이 "" "와는 다른 .NET 클라이언트 라이브러리에서 나오지 만 일반적으로 동일하게 취급합니다. ).

나는 오라클이 옳다고 말하지는 않지만 두 가지 방법 모두 거의 똑같이 나쁘다.

실제로, 나는 유효하지 않은 dateTime 값 (인쇄, 변환 또는 아무것도 덤프 () 함수로 볼 수 없음)을 포함하여 Oracle을 다루는 데 어려움이 없었습니다. 허용된 데이터베이스에 삽입하려면 이진 열로 클라이언트의 버기 버전을 통해 분명히! 데이터베이스 무결성을 보호하기 위해 너무 많이!

Nulls 링크의 Oracle 처리 :

http://digitalbush.com/2007/10/27/oracle-9i-null-behavior/

http://jeffkemponoracle.com/2006/02/empty-String-andor-null.html

우선, Null과 Null String이 항상 Oracle에 의해 동일하게 취급되는 것은 아닙니다. 널 문자열은 정의상 문자가없는 문자열입니다. 이것은 Null과 전혀 동일하지 않습니다. NULL은 정의상 데이터가없는 것입니다.

5 ~ 6 년 전, Null String은 Oracle에 의해 Null과 다르게 취급되었습니다. Null과 마찬가지로 Null String은 모든 것과 같고 모든 것과 다릅니다 (Null은 괜찮다고 생각하지만 Null String의 경우 완전히 잘못된 것), Null String이 널 스트링이기 때문에 최소한 길이 (Null String)가 0을 반환합니다. 길이가 0 인 문자열.

현재 Oracle에서는 길이 (null)를 반환합니다. Null은 괜찮다고 생각하지만 길이 (Null String)도 완전히 잘못된 Null을 반환합니다.

나는 그들이 왜이 두 가지 뚜렷한 "값"을 동일하게 취급하기로 결정했는지 이해하지 못한다. 그것들은 다른 것을 의미하며 프로그래머는 각각 다른 방식으로 행동 할 수 있어야합니다. 그들이 그들의 방법론을 바꾸 었다는 사실은 그들이 이러한 값을 어떻게 처리 해야하는지에 대한 단서가 없다는 것을 말해줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top