복붙노트

[SQL] 왜 오라클은 NULL로 빈 문자열을 취급 9I는 무엇입니까?

SQL

왜 오라클은 NULL로 빈 문자열을 취급 9I는 무엇입니까?

나는 그것이 NULL로 '고려 않는다는 것을 알고,하지만이 경우 이유를 말해 많은 일을하지 않습니다. 하나는 유효한 자료이고, 다른 하나는 그 같은 정보의 부재를 나타내는입니다 - 나는 SQL 사양을 알고있는 것처럼 ','NULL과 동일하지 않습니다.

추측 자유롭게,하지만 그런 경우가 있다면 알려주십시오. 그것은에 댓글을 달 수 오라클 사람이 있다면, 그 환상적 일 것입니다!

해결법

  1. ==============================

    1.내가 대답 오라클은 아주, 아주 오래된 것을 믿습니다.

    내가 대답 오라클은 아주, 아주 오래된 것을 믿습니다.

    돌아 가기 SQL 표준이되기 전에 옛날에, 오라클은 VARCHAR / VARCHAR2 컬럼에 빈 문자열이 NULL 있다고 설계 결정을하고 NULL 단 하나의 의미가 있다고 (적이있다 데이터를 구별 할 관계 이론가가있다 대답은 존재하지만 사용자가 알 수없는 데이터를 입력하라는 메시지가, NULL의 어떤 의미를 구성하는 모두 아무 대답도 등) 데이터가없는 경우.

    표준 SQL 주위에 와서 그 NULL을 동의하고 빈 문자열이 별개의 실체라고 무렵, 두 사람이 동등했다 가정 코드를 가지고 이미 오라클 사용자가 있었다. 그래서 오라클은 기본적으로 기존 코드를 깨는 SQL 표준을 위반하거나, 쿼리의 잠재적으로 많은 수의 기능을 바꿀 것 초기화 매개 변수의 일종을 도입하는 옵션이 남겨졌다. 표준 SQL (IMHO)를 위반하면이 세 가지 옵션 중 가장 파괴적이었다.

    오라클은 (모두가 같은 향후 유지하기 위해 해당 데이터 유형의 동작이 보장되기 때문에 오라클의 VARCHAR2를 사용하는 이유입니다) VARCHAR 데이터 유형은 SQL 표준을 준수하기 위해 향후 릴리스에서 변경 것이라는 가능성이 열려있다.

  2. ==============================

    2.오라클의 톰 카이트 부사장 :

    오라클의 톰 카이트 부사장 :

  3. ==============================

    3.난 당신이 오라클을 생각하면이 훨씬 더 의미가 생각 이전의 개발자들이 아마 그런 식으로 - 데이터 입력 시스템의 영광을 백엔드로. 데이터베이스의 모든 필드는 자신의 화면에 데이터 입력 운영자 톱 그 형태의 필드에 맞습니다. 운영자가이 "생일"또는 "주소"여부, 필드에 아무 것도 입력하지 않은 경우 해당 필드에 대한 데이터는 "알 수없는"입니다. 운영자가 그 사람의 주소는 정말 빈 문자열 표시하기 위해, 그리고 정말 어쨌든 많은 이해가되지 않습니다에 대한 방법은 없습니다.

    난 당신이 오라클을 생각하면이 훨씬 더 의미가 생각 이전의 개발자들이 아마 그런 식으로 - 데이터 입력 시스템의 영광을 백엔드로. 데이터베이스의 모든 필드는 자신의 화면에 데이터 입력 운영자 톱 그 형태의 필드에 맞습니다. 운영자가이 "생일"또는 "주소"여부, 필드에 아무 것도 입력하지 않은 경우 해당 필드에 대한 데이터는 "알 수없는"입니다. 운영자가 그 사람의 주소는 정말 빈 문자열 표시하기 위해, 그리고 정말 어쨌든 많은 이해가되지 않습니다에 대한 방법은 없습니다.

  4. ==============================

    4.이 문제에 대한 오라클 문서 경고 개발자는, 지금까지 버전 7로 적어도 다시 것.

    이 문제에 대한 오라클 문서 경고 개발자는, 지금까지 버전 7로 적어도 다시 것.

    오라클은 "불가능 값"기술로 NULLS를 표현하기로 결정했습니다. 예를 들어, 숫자 위치에 NULL은 "마이너스 제로"불가능한 값으로 저장됩니다. 계산 결과 상관 마이너스 제로가 저장되기 전에 정의 제로로 변환 될 것이다.

    오라클은 또한 VARCHAR의 길이가 0의 문자열 (빈 문자열) 불가능한 값이 될 수 및 NULL을 표현을하는 경우 적합한 선택을 고려, 잘못 선택했다. 그것은 빈 문자열이 불가능한 값에서 멀리 것으로 나타났다. 심지어 문자열 연결의 작동에 따라 신원입니다!

    오라클 내용은 해당 데이터베이스 디자이너와 개발자를 경고 오라클 힘의 일부 미래 버전 빈 문자열과 NULL 사이의 연결을 중단하고, 그 조합에 따라 코드를 휴식.

    이 불가능 값 이외의 플래그 NULLS에 기술이있다, 그러나 오라클은 사용하지 않았다.

    (I는 행과 열이 교차을 의미하는 위의 "위치"라는 단어를 사용하고 있습니다.)

  5. ==============================

    5.빈 문자열이 NULL과 동일 때문에 단순히 두 (빈 문자열 및 널 (null))가 다를 경우 상황에 비해 그것 "차악".

    빈 문자열이 NULL과 동일 때문에 단순히 두 (빈 문자열 및 널 (null))가 다를 경우 상황에 비해 그것 "차악".

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

  6. ==============================

    6.공식 11g의 문서에 따르면,

    공식 11g의 문서에 따르면,

    가능한 이유

  7. ==============================

    7.책에서 예

    책에서 예

       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;
    
  8. ==============================

    8.NULL로 치료하지 때문에 중, 특히 도움이되지 않습니다.

    NULL로 치료하지 때문에 중, 특히 도움이되지 않습니다.

    오라클에이 지역에 실수를하면, 당신은 일반적으로 즉시 확인할 수 있습니다. SQL 서버에서, 그러나, 작업에 나타납니다, 누군가가 대신 아마 널 (null) "는"다른 .NET 클라이언트 라이브러리에서 NULL (의 빈 문자열을 입력 할 때 문제에만 나타납니다,하지만 당신은 일반적으로 그들에게 동일한 치료 ).

    나는 오라클이 옳다고 말하는 게 아니에요,하지만 두 가지 약 똑같이 나쁜 나에게 보인다.

  9. ==============================

    9.사실, 내가 잘못된 날짜 값을 포함, 오라클 다루는 것도 있지만 어려움이 없었습니다 분명히 몇 가지 버그를 통해 데이터베이스에 삽입되는 것이 허용되는 (단지 DUMP () 함수를 보았다, 변환 또는 아무것도, 인쇄 할 수 없습니다) 진 열의로 클라이언트의 버전! 데이터베이스 무결성을 보호하기위한 순전히!

    사실, 내가 잘못된 날짜 값을 포함, 오라클 다루는 것도 있지만 어려움이 없었습니다 분명히 몇 가지 버그를 통해 데이터베이스에 삽입되는 것이 허용되는 (단지 DUMP () 함수를 보았다, 변환 또는 아무것도, 인쇄 할 수 없습니다) 진 열의로 클라이언트의 버전! 데이터베이스 무결성을 보호하기위한 순전히!

    오라클은 NULL을 링크의 취급 :

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

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

  10. ==============================

    10.우선, 널 (null)과 널 (null) 문자열은 항상 오라클 동일하게 취급되지 않았다. 널 (null) 문자열은, 정의에 의해, 문자열은 어떤 문자가 포함되지 않습니다. 이것은 모든에 널 (null)와 동일하지 않습니다. NULL은 정의, 데이터의 부재에 의해입니다.

    우선, 널 (null)과 널 (null) 문자열은 항상 오라클 동일하게 취급되지 않았다. 널 (null) 문자열은, 정의에 의해, 문자열은 어떤 문자가 포함되지 않습니다. 이것은 모든에 널 (null)와 동일하지 않습니다. NULL은 정의, 데이터의 부재에 의해입니다.

    다섯 6 년 정도 전에, 널 (null) 문자열은 오라클 널 다르게 처리 하였다. 반면, 널 (null)처럼, 널 (null) 문자열 (이 내가 생각하는 널 (null)에 대한 괜찮지 만, 완전히 잘못된 널 (null) 문자열)는 널 (null) 문자열이 있어야 이후로, 최소 길이 (널 문자열)에서, 0을 반환 모든 이르기까지 모든 같고 달랐다 길이가 0 인 문자열.

    현재 오라클, 내 생각의 길이 (널)를 반환 null가 오케이이지만, 길이 (널 (null) 문자열)도 완전히 잘못을 돌려줍니다.

    그들이이 두 별개의 "값"같은 치료를 시작하기로 결정 이유를 이해하지 않습니다. 그들은 다른 것을 의미하고 프로그래머는 다른 방법으로 각각에 작용하는 능력을 가져야한다. 그들의 방법을 변경 한 사실은 정말 이러한 값을 처리하는 방법에 대한 실마리가없는 것을 알려줍니다.

  11. from https://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as-null by cc-by-sa and MIT license