programing

Oracle 9i에서 빈 문자열을 NULL로 취급하는 이유는 무엇입니까?

goodjava 2023. 3. 6. 21:08

Oracle 9i에서 빈 문자열을 NULL로 취급하는 이유는 무엇입니까?

「」를 「」로 간주하고 있는 것을 알고 있습니다.NULL하지만 왜 그런지는 별로 알 수 없다.SQL 사양을 이해한 결과, '는NULL이고, 다른 하나는 .-- 하하 、 른 -- 、 른른 、 른른 、 -- -- -- -- -- -- -- 。

얼마든지 추측해 주세요.그런지 어떤지는 꼭 기입해 주세요.Oracle에서 코멘트를 해 주실 수 있는 분이 있으면 좋겠습니다.

저는 Oracle이 아주 오래되었다는 것이 정답이라고 생각합니다.

은 SQL 내의 빈 .VARCHAR/VARCHAR2은 '''입니다.NULLNULL의 되지 않은 알지 이 없는 ).이 모든 이 NULL의 를 구성하고 .는 데이터 등을 구별하는 관계 이론가가 있습니다).이러한 모든 것이 어떤 의미를 구성합니다.NULL를 참조해 주세요.

되어 SQL이 했을 때NULL빈 문자열은 별개의 엔티티로, 이미 두 문자열이 동등하다고 가정하는 코드를 가진 Oracle 사용자가 있었습니다.따라서 Oracle은 기본적으로 기존 코드를 해제하거나 SQL 표준을 위반하거나 잠재적으로 많은 쿼리의 기능을 변경하는 일종의 초기화 매개 변수를 도입할 수 있는 옵션을 남겨두었습니다.SQL 표준(IMHO) 위반은 이 세 가지 옵션 중 가장 중단을 줄였습니다.

오라클은 이 모든 가능성을 열어두고 있습니다.VARCHAR 타입이 이 때문에 가 SQL 표준을 사용합니다).VARCHAR2Oracle의 경우 해당 데이터 유형의 동작은 앞으로도 동일하게 유지됩니다.)

Oracle의 Tom Kyte 부사장:

ZERO 길이의 varchar는 NULL로 취급됩니다.

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

char(1)에 할당되어 있는 경우는, 「」가 됩니다(char 타입은 공백 패딩 문자열입니다).

varchar2(1)에 할당되면 길이가 0인 문자열이 되고 길이가 0인 문자열은 Oracle에서는 NULL이 됩니다(길지 않은 문자열).

Oracle 문서는 적어도 버전 7까지 거슬러 올라가 개발자에게 이 문제를 경고합니다.

Oracle은 NULLS를 "불가능한 가치" 기술로 표현하기로 선택했습니다.예를 들어 숫자 위치의 NULL은 불가능한 값인 "마이너스 제로"로 저장됩니다.계산 결과 마이너스 0은 저장되기 전에 양의 0으로 변환됩니다.

또한 Oracle은 길이 0의 VARCHAR 문자열(빈 문자열)을 불가능한 값으로 간주하여 NULL을 나타내기 위한 적절한 선택으로 잘못 선택했습니다.빈 문자열이 불가능한 값과는 거리가 먼 것으로 나타났습니다.스트링 연결 조작 하의 아이덴티티이기도 합니다!

Oracle 설명서는 데이터베이스 설계자와 개발자에게 빈 문자열과 NULL 사이의 이 연결을 끊고 해당 연결에 종속된 모든 코드를 끊을 수 있음을 경고합니다.

불가능한 값 외에 NULL에 플래그를 붙이는 기술이 있지만 Oracle은 이를 사용하지 않았습니다.

(위의 "위치"라는 단어는 행과 열의 교차를 의미합니다.)

이전 개발자들이 데이터 입력 시스템을 위해 미화된 백엔드로 Oracle을 생각하는 것이 훨씬 더 타당하다고 생각합니다.데이터베이스의 모든 필드는 데이터 입력 작업자가 화면에서 본 형식의 필드에 해당합니다.연산자가 "생일" 또는 "주소" 필드에 아무것도 입력하지 않은 경우 해당 필드의 데이터는 "알 수 없음"이 됩니다.교환원이 누군가의 주소가 정말로 빈 문자열이라고 표시할 방법이 없고, 어쨌든 그것은 별로 말이 되지 않습니다.

공식 11g 문서에 따르면

Oracle Database는 현재 길이가 0인 문자 값을 null로 처리합니다.그러나 이후 릴리스에서는 이 문제가 계속 적용되지 않을 수 있으며 Oracle에서는 빈 문자열을 null과 동일하게 취급하지 않는 것이 좋습니다.

생각할 수 있는 이유

  1. val IS NOT NULL val != ''
  2. 가지 을 모두 는 없습니다.val != '' and val IS NOT NULL

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

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;

NULL로 취급하지 않는 것도 별로 도움이 되지 않기 때문입니다.

Oracle에서 이 영역에서 오류가 발생하면 보통 즉시 알아차립니다.단, SQL 서버에서는 동작하는 것처럼 보이며 문제는 NULL 대신 빈 문자열을 입력한 경우에만 발생합니다(아마도 .net 클라이언트라이브러리에서는 NULL이 "와 다르지만 보통 동일하게 취급합니다).

Oracle이 맞다고는 할 수 없지만, 두 가지 방법이 거의 똑같이 나쁜 것 같습니다.

실제로 클라이언트의 버그가 있는 버전을 바이너리 컬럼으로 사용하여 데이터베이스에 삽입할 수 있는 비활성 datetime 값(인쇄, 변환 또는 아무것도 할 수 없고 DUMP() 함수로만 볼 수 있음)을 포함하여 Oracle 처리에 어려움이 있었습니다.데이터베이스 무결성 보호는 이제 그만!

NULL 링크의 Oracle 처리:

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

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

우선 Oracle에서는 늘 문자열과 늘 문자열이 항상 동일하게 취급되지 않았습니다.늘 문자열은 정의상 문자를 포함하지 않는 문자열입니다.이것은 null과 전혀 같지 않다.NULL은 정의상 데이터가 없는 것입니다.

5~6년 전만 해도 Oracle에서는 늘 문자열이 늘과 다르게 취급되었습니다.null 문자열은 null 문자열과 마찬가지로 모든 문자열과 동일하고 모든 문자열과는 다르지만(null 문자열은 괜찮지만 null 문자열은 완전히 잘못됨), null 문자열은 길이가 0인 문자열이므로 적어도 length(null 문자열)는 0을 반환합니다.

현재 Oracle에서 length(null)는 정상인 null을 반환하지만 length(null 문자열)도 완전히 잘못된 null을 반환합니다.

저는 왜 그들이 이 두 가지 다른 "가치"를 동일하게 취급하기 시작했는지 이해할 수 없습니다.그것들은 다른 것을 의미하며 프로그래머는 서로 다른 방식으로 행동할 수 있는 능력을 가져야 한다.그들이 방법론을 바꿨다는 사실은 그들이 이러한 가치들을 어떻게 다루어야 하는지에 대해 정말로 알지 못한다는 것을 말해준다.

언급URL : https://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as-null