본문 바로가기
IT

DBMS : 데이터베이스 시스템에서 빈 문자열''과 NULL의 처리방법에 대해서 - 오라클 : 알티베이스

by developer's warehouse 2024. 2. 7.

오늘은 데이터베이스 시스템(DBMS)에서 빈문자열('')과 null을 비교하는 방법에 대해서 알아보도록하겠습니다.

다음과 같은 순서로 설명합니다.

DBMS : 데이터베이스 시스템에서 빈 문자열''과 NULL의 처리방법에 대해서 - 오라클 :알티베이스 썸네일

 

DBMS에서 NULL이란 무엇인가?

NULL은 데이터베이스에서 값이 없음을 나타내는 특별한 값입니다. NULL은 "unknown"이나 "unavailable" 값을 의미합니다.

NULL은 데이터베이스에서 데이터가 없는 경우, 즉 값이 없는 경우 사용됩니다. 예를 들어, 고객의 전화번호가 존재하지 않는 경우, 해당 필드에 NULL 값을 저장할 수 있습니다. 이는 데이터의 일부분이 누락되어 있거나 알 수 없는 경우에 유용합니다.

NULL 값은 일반적으로 다른 값과 구별하기 위해 특별한 표시 방법을 사용합니다. SQL에서는 NULL 값은 NULL 키워드로 표현됩니다. NULL 값은 데이터베이스에서 연산이나 비교를 할 때 주의해야 합니다. NULL 값을 비교하거나 NULL 값으로 연산을 하면 예상치 못한 결과를 얻을 수 있습니다. 예를 들어, NULL = NULL은 거짓(false)이 됩니다.

NULL 값에 대해 처리해야 할 경우, 다음과 같은 SQL 함수를 사용할 수 있습니다.

 

  • IS NULL : 해당 값이 NULL인지 확인합니다.
  • IS NOT NULL : 해당 값이 NULL이 아닌지 확인합니다.
  • COALESCE : NULL 값을 다른 값으로 대체합니다.
  • IFNULL : NULL 값을 다른 값으로 대체합니다.

 

NULL 값의 사용은 데이터베이스 설계 및 쿼리 작성 시 고려해야 하는 중요한 사항입니다. 올바른 NULL 값의 처리 방법을 선택하고 적용하면 데이터의 정확성과 일관성을 유지할 수 있습니다.

 

빈 문자열('')과 NULL을 취급하는 방식은?

빈 문자열 ('')을 NULL로 취급하는지 여부는 DBMS에 따라 다르게 구현될 수 있습니다. 아래는 몇 가지 유명한 DBMS들의 동작 방식에 대한 간단한 설명입니다.

Oracle

Oracle에서는 빈 문자열('')을 NULL로 취급합니다. 따라서, 빈 문자열과 NULL은 동일한 값으로 취급됩니다. 이는 ANSI SQL 표준과도 일치합니다.

Altibase

Altibase에서는 빈 문자열('')을 NULL로 취급합니다. 따라서, 빈 문자열과 NULL은 동일한 값으로 취급됩니다. 이는 ANSI SQL 표준과도 일치합니다.

MySQL

MySQL은 빈 문자열('')과 NULL을 서로 다른 값으로 취급합니다. 즉, ''과 NULL은 서로 다른 값으로 처리됩니다. MySQL에서 빈 문자열을 NULL로 취급하고자 하는 경우, '' 대신 NULL 값을 사용해야 합니다.

SQL Server

SQL Server에서는 빈 문자열('')을 NULL로 취급합니다. 따라서, 빈 문자열과 NULL은 동일한 값으로 취급됩니다. 이는 ANSI SQL 표준과도 일치합니다.

PostgreSQL

PostgreSQL에서는 빈 문자열('')을 NULL로 취급하지 않습니다. 즉, ''과 NULL은 서로 다른 값으로 처리됩니다. PostgreSQL에서 빈 문자열을 NULL로 취급하고자 하는 경우, ''을 NULL로 변환해야 합니다.

SQLite

SQLite에서는 빈 문자열('')을 NULL로 취급하지 않습니다. 즉, ''과 NULL은 서로 다른 값으로 처리됩니다. SQLite에서 빈 문자열을 NULL로 취급하고자 하는 경우, ''을 NULL로 변환해야 합니다.

위의 설명은 각 DBMS의 일반적인 동작 방식을 나타내며, 구체적인 구현 방식은 DBMS 버전 및 설정에 따라 달라질 수 있습니다. 따라서, 빈 문자열과 NULL을 구분하여 사용해야 하는 경우, 각 DBMS에서 사용하시는 문서를 참조하여 구현 방식을 확인하는 것이 좋습니다.

오라클과 알티베이스에서 빈 문자열 처리 방식 테스트 결과

DBMS에서 Stored Procedure를 사용할 때에는 대부분 변수를 사용해야합니다. 이때 해당 변수는 VARCHAR 타입이며 이 변수는 빈 문자열('')로 초기화 됩니다. 이런 변수를 비교할때 어떤 연산자를 사용해야하는지 테스트 해보도록 하겠습니다.
 

오라클( Oracle )

 
먼저 오라클에서 다음과 같이 수행하여 프로시저를 만듭니다.
 
CREATE OR REPLACE PROCEDURE compare_strs AS
  str1 VARCHAR(10) := '';
  str2 VARCHAR(10) := '';
  result VARCHAR(10);
BEGIN
  IF str1 = str2 THEN
    result := 'success';
  ELSE
    result := 'failure';
  END IF;
  
  -- 결과 출력
  DBMS_OUTPUT.PUT_LINE('Comparison result: ' || result);
END;
/
Oracle Stored Procedure에서 DBMS_OUTPUT.PUT_LINE 함수를 사용하여 결과를 출력하는 경우, 결과가 SQL*Plus를 사용하는 경우 화면에 표시되도록 아래 명령어를 수행하여 줍니다.
 
SET SERVEROUTPUT ON
이 상태에서 처음에 만든 프로시저를 수행하면 다음과 같은 결과가 나옵니다.
SQL> exec compare_strs;
Comparison result: failure

PL/SQL procedure successfully completed.이
이것은 오라클에서 "=" equal 연산자가 성립되지 않았다는 것을 뜻하고 그것은 빈 문자열('')는 NULL로 취급되고 있습니다.
확인을 위해서 아래와 같은 프로시저를 다시 생성하여 테스트합니다.
 
CREATE OR REPLACE PROCEDURE compare_strs AS
  str1 VARCHAR(10) := '';
  str2 VARCHAR(10) := '';
  result VARCHAR(10);
BEGIN
  IF str1 is null and str2 is null THEN
    result := 'success';
  ELSE
    result := 'failure';
  END IF;
  
  -- 결과 출력
  DBMS_OUTPUT.PUT_LINE('Comparison result: ' || result);
END;
/
SQL> exec compare_strs;
Comparison result: success

PL/SQL procedure successfully completed.
 
예상대로 이 테스트 결과는 success를 출력하였고, 오라클에서는 ''는 NULL로 취급합니다.
 

알티베이스 (Altibase)

오라클을 테스트해 보았으므로 알티베이스는 하나의 프로시저에서 확인을 수행합니다.
CREATE OR REPLACE PROCEDURE proc1
AS
str1 char (10);
str2 char (10);
BEGIN

 str1 := '';
 str2 := '';
  if str1 = str2 then
    println( 'equal' );
  else
    println( 'not equal' );
  end if;
  if str1 is null and str2 is null then
    println('null equal');
  else
    println('not null');
  end if;
 END;
 /
Create success.

오라클과 유사하지만 하나의 프로시저에 두 개의 확인 절차를 모두 넣고 프로시저를 만들었습니다.
실행해보면 다음과 같습니다.
 
iSQL> exec proc1;
not equal
null equal
Execute success.
알티베이스도 빈 문자열('')을 null로 처리합니다.
 

최종 확인 테스트

좀 더 단순하게 테스트하기 위해서 빈 문자열과 null을 dump 함수를 통해 검색해 보았습니다.
 
< 오라클 >
SQL> select dump(''),dump(null) from dual;

DUMP('')     DUMP(NULL)
------------ ------------
NULL         NULL
 
< 알티베이스 >
iSQL> select dump(''),dump(null) from dual;
DUMP('')              DUMP(null)
-----------------------------------------------
NULL                  NULL
1 row selected.
오라클과 알티베이스는 빈 문자열을 null로 인식하는 것이 확인 되었습니다.
 
facebook twitter kakaoTalk kakaostory naver band shareLink