오라클에서 길이가 없는 문자열(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 을 반환한다.
단, 다음은 참이다.
* '' = ''
* '' = 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 을 구별하기로 정해진 이후에도 하위 호환성을 위해 열어둔 것 같다고 함.
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 을 구별하기로 정해진 이후에도 하위 호환성을 위해 열어둔 것 같다고 함.
'IT > 오라클' 카테고리의 다른 글
시간을 시간답게 다뤄주세요 - 시간차 계산시 주의점 (0) | 2013.08.01 |
---|---|
데이터베이스 변경(버전) 관리 (0) | 2010.05.07 |
랜덤 값 입력하기 (0) | 2010.05.04 |
Oracle Tip #1 : 날짜다루기 기본 (0) | 2010.03.18 |