IT 관련/Database

널값과 빈 문자열의 차이 (null values vs empty string )

nullzone 2021. 6. 11.
반응형

최근에 오라클 database를 볼 일이 생겼다.

내가 it업계에 첫발을 놓을때(벌써 25~6년전이네) database는 온통 오라클이였고...

가끔, DB2, Sybase, informix, MS-Sql 등을 볼 수 있었다.

따라서 모든 RDB의 표준은 오라클이였고, 오라클을 잘 다루어야 DB 좀 하는군 하는 소리를 듣던 때다.

 

각설하고

1. 오라클에서 문자열을 저장할 수 있는 대표적인 타입이 char, varchar, varchar2 3가지이며, 

이들의 차이점은 무엇일까?

Char(4), varchar(4), varchar2(4) 오라클에서 3개의 컬럼을 만들고 'A' 라는 문자열을 넣게 되면...

char(4)에는 'A   ' 공백이 포함되어 저장됩니다.

varchar(4), varchar2(4) 에는  입력한 'A' 값만들어갑니다. 물론 length도 1입니다.

 

-. 당연히 'A   ' 와 'A'는 다른 값이므로 서로 조인해도 값이 나오지 않습니다.

   이런 부분 때문에 의도 하지 않은 쿼리결과가 나오므로 주의 해야 합니다.

   이걸 억지로 하겠다고 trim등을 이용해서 쿼리를 만드는 경우가 있는데

   이건 더 큰 문제를 만들 수 있으므로 절대 해서는 안됩니다.

 

그럼 char 타입은 언제 사용하는가?

자주 사용하는 'Y' or 'N' 등의 flag값을 저장 할때, 또는 데이터 길이가 항상 일정하게 만들어지는 Fix Code값 컬럼등을 이용할때 써야 합니다.

 

2. varchar, varchar2 의 차이점은 무엇일까?

현재는 차이가 없다.

오라클을 실전에서 적용한지가 꽤 시간이 흘러서 현재 오라클에서 제공한 레퍼런스를 보니 차이가 없으며, 향후에 varchar 타입의 용도가 변경될 예정이므로 varchar2를 사용하라고 되어 있네요...

 

20년이 지난 이야기지만, 기억을 되살려 보면 varchar2가 처음 나왔을때 라고 기억합니다.

ANSI 표준에 따르면 NULL과 빈 문자열을 구분하도록 했습니다. 

근데 문제는 오라클에서 이를 구분하지 않는 varchar2 타입을 만들었습니다. 

 

잠시 이를 설명하기 위해 Mysql(mariaDB), MSSQL 등의 database에서 보면 

varchar 타입에 ''(빈문자열) 과 null값을 넣으면 서로 다른 값을 가지게됩니다. 

 

 -. null값은 말그대로 널(null)값입니다, 비어있다(empty)라는 의미와는 다릅니다.

 -. NULL 값은 연산 자체가 않됩니다. length() 도 null 입니다 

 -. 반면 빈문자열은(empty) 일부 연산이 가능합니다. ('abc' +'' = 'abc' )

간단히 테스트 해보면 ''(빈문자열) 과 NULL값을 구분하는 걸 볼 수 있습니다. 

 

다시 오라클로 돌아와서 

varchar2 타입에 ''(빈문자열) 과 null값을 넣으면 놀랍게도 모두 null값이 됩니다. 

varchar 타입에 역시 varchar2와 동일하게 동작합니다. 

원래 ANSI 표준에 따르면 이 부분은 문제가 있어 보입니다- 물론 제 견해 입니다.

 

 

 

 

 

 

 

 

반응형

댓글