본문 바로가기
IT/오라클

오라클에서 길이가 없는 문자열은 null 이다.

by yjacket 2011. 7. 1.
오라클에서 길이가 없는 문자열(aka empty string, white space, blank)은 null 로 취급된다.
즉, 필드에 들어있는 값이나 '' 문자 또는 함수가 반환하는 값이 길이가 없는 문자열이라면 null 로 취급된다는 것이다.
이러한 특징은 여타 DBMS 와 다른 특징이므로 매우 주의해야 할 점이다.

몇가지 예를 통해 오라클에서 길이가 없는 문자열을 null 로 취급하고 있음을 확인해보자.

1. NVL
NVL(expr1, expr2) 함수는 expr1이 null 이 아니면 expr1을 그대로 반환하고, null 이면 expr2을 반환한다.
NVL 을 이용해 null 이면 길이가 없는 문자열을 반환하도록 다음과 같이 쿼리를 작성하고 테스트해보면

SELECT NVL(null, '') FROM DUAL


의도와는 다르게 아래와 같이 null 이 반환되버린다.

 NVL(NULL,'')    
 --------------- 
 (null)          

2. INSERT
not null 필드에 길이가 없는 문자열을 삽입하기위해 임시테이블을 만들고, 레코드를 추가해보자.

CREATE TABLE TestTable (field1 varchar(50) not null)
GO
INSERT INTO TestTable VALUES ('')


그러면 다음과 같이 에러가 발생한다.

>[에러] 스크립트 라인: 1-1 ----------------------------------
 ORA-01400: NULL을 ("USER1"."TestTable"."FIELD1") 안에 삽입할 수 없습니다
 스크립트 라인 1. 문장 라인 1, 컬럼 26

3. 비교
'' 은 무엇과 비교하더라도 true 가 될 수 없다. 따라서 다음은 모두 true 가 아니다.

* '' = ''
* '' = NULL
* AnyExpression = ''


그리고 다음은 null 을 반환한다.

* trim(' ')
* '' 을 저장한 필드


단, 다음은 참이다.

* '' IS NULL


 
왜 오라클은 empty string 을 null 로 취급할까?
http://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as-null 
SQL standard 가 만들어지기 전 empty string 으로 null 을 식별하도록 디자인 했었는데, SQL Standard 에서 empty string 과 null 을 구별하기로 정해진 이후에도 하위 호환성을 위해 열어둔 것 같다고 함.