1. 개요
CUBRID와 Oracle의 NULL, ‘’(empty string)의 차이점을 확인한다.
2. 테스트 시나리오
1) 샘플 테이블(test_table)에 char(10), varchar(10)을 생성
2) 샘플 데이타 테스트, null, ''(empty string)을 입력
3) select 실행 및 결과 비교
create table test_table ( id varchar(100), col1 char(10), col2 VARCHAR(10) ); |
insert into test_table values ('value', 'cubrid', 'cubrid') ; insert into test_table values ('null', NULL, NULL ) ; insert into test_table values ('empty string', '', '' ) ; |
select id, col1, length(col1) col1_length, nvl(col1, 'null') col1_null_check, col2, length(col2) col2_length, nvl(col1, 'null') col2_null_check from test_table ; |
- CUBRID 실행결과 | |||||||
NO |
id |
col1 |
col1_length |
col1_null_check |
col2 |
col2_length |
col2_null_check |
1 |
Value |
cubrid |
10 |
cubrid |
cubrid |
6 |
cubrid |
2 |
Null |
(NULL) |
(NULL) |
null |
(NULL) |
(NULL) |
null |
3 |
Empty string |
|
10 |
|
|
0 |
|
- Oracle 실행결과 | |||||||
NO | id | Col1 | Col1_length | Col1_null_check | Col2 | Col2_length | Col2_null_check |
1 | Value | cubrid | 10 | cubrid | cubrid | 6 | cubrid |
2 | Null | (NULL) | (NULL) | null | (NULL) | (NULL) | null |
3 | Empty string | (NULL) | (NULL) | null | (NULL) | (NULL) | null |
NULL 값과 문자값은 CUBRID, Oracle 모두 동일하게 처리한다.
위 테스트 결과와 같이 id값이 ‘Value’, ‘Null’인 SQL 실행 결과는 동일하다.
CUBRID와 Oracle 모두 char 컬럼 타입과 varchar 컬럼에 데이터를 입력하고 조회 한 결과는 동일 함.
Char 타입에서 남은 공간은 space(공백)로 채우는 것도 동일
CUBRID와 Oracle 모두 char 컬럼 타입과 varchar 타입에 Null을 입력하면 동일하게 Null로 처리
틀리게 처리하는 내용은 Empty string(‘’)이다.
CUBRID는 empty string을 ‘’로 처리 함. Oracle에서는 Empty string(‘’)을 Null로 처리 한다.
CUBRID에서는 ‘’를 char 타입에 입력하면, 남은 공간을 공백으로 처리하고,
Oracle은 ‘’ 값을 입력하면 null로 처리함으로 공백으로 처리하지 않는다.
Length 함수를 사용하여 길이를 확인 해 보면
CUBRID에서는 char 컬럼타입은 컬럼 길이만큼 space(공백)으로 체워짐으로 컬럼길이 10이 보여지고,
varchar에는 0으로 보여진다.
그에 반해서 Oracle은 null로 입력 됨으로 length를 체크해도 char, varchar 타입 모두 null로 보여진다.
4. DB 전환 시 유의 사항
위 결과와 같이 컬럼의 값이 NULL 또는 값이 있는 컬럼은 CUBRID와 Oracle이 모두 동일하게 처리함으로 이슈는 없다.
기존 Oracle에서 NULL과 Empty string을 각각 의미 있는 값으로 사용하고 있다면,
설계가 잘 못된 것이므로 Empty string을 의미 있는 값으로 처리 될 수 있도록 코드설계를 다시 하는 것이 가장 바람직하다.
그러지 못할 경우에는 아래의 내용을 참고하기 바라며,
아래의 해결 방법으로 처리 할 경우에는인덱스를 활용하지 못하여 성능에 큰 영향을 끼칠 수도 있다.
Empty String 데이터 처리의 동일한 결과를 위해서는 입력/수정 처리 또는 조회 처리에서 변경이 필요하다.
Oracle과 동일한 처리를 위해서는
1안) 입력 처리 시에 Empty string을 Null로 입력되도록 처리
예시) decode 함수 이용(입력값이 ‘’이면 NULL로 처리) : decode(입력값, ‘’, NULL, 입력값 )
2안) 조회 처리 시에 NULL값 조회(is null, is not null)가 아닌 Empty string값으로 조회처리 되도록 수정
예시) OR조건으로 NULL과 ‘’값을 함께 조회 : 조회컬럼 is null OR 조회컬럼 = ‘’
Articles
- windows 환경에서 압축파일로 CUBRID 설치시 환경변수 쉽게 설정하기
- CUBRID dummy data생성-간단편
- CUBRID HA에서 사용하는 포트 확인 방법(1523, 59901)
- 카디시안(한 Row를 여러 Row) 쿼리문 만들기1
- 32bit JRE 환경에서 64bit CUBRID Tool 사용
- CUBRID Manager 및 엑셀 파일을 이용하여 데이터 입력 시, garbage값이 포함되어 저장...
- SQL튜닝 - 인덱스 활용 사례
- JAVA SP 사용 시 로그 처리 방법
- 디비와 테이블 문자셋이 다른 경우 처리 방법
- A테이블의 다수의 컬럼을 B테이블로 UPDATE 하는 SQL
- 전체 레코드 개수 확인하는 SP
- MERGE INTO 사용 예제 ( INSERT, UPDATE문을 1개의 쿼리로 실행 )
- 워크스페이스 사용중입니다. 다른 워크스페이스를 선택하세요. 대응법
- CUBRID Manager 메모리 설정하기(cubridmanager.ini)
- CUBRID HA와 Primary key 제약조건
- 테이블 사용량 확인방법
- cubrid manager server 구동 시 no "events" section in configuration 오류 발생
- 9.2 버전에서 복제 재구축(ha_make_slavedb.sh) 스크립트를 사용하려면 수정해야 할 부분
- CUBRID vs MySQL vs ORACLE SQL 타입별 비교
- 오류데이타검증 - 숫자 이외의 데이타 확인하는 방법