문서유형ㅣ기술정보
분야ㅣ마이그레이션
적용제품버전ㅣTibero7.2.4
문서번호ㅣTMITI021
개요
RDBMS별 NULL 처리 방식에 대해 안내합니다.
주의
RDBMS 마다 NULL 처리가 다르므로 이기종 RDBMS간 데이터 마이그레이션 수행 시 주의가 필요합니다.
테스트 버전 정보
| RDBMS | VERSION | SQL |
| TIBERO | 7.2.4 | SELECT * FROM VT_VERSION; |
| ORACLE | Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production | SELECT * FROM V$VERSION; |
| MySQL | 8.0.29 | SELECT VERSION(); |
| MariaDB | 10.8.3-MariaDB-1:10.8.3+maria~jammy | SELECT VERSION(); |
| SQL Server (MS) | Microsoft SQL Server 2022 (CTP2.0) - 16.0.600.9 (X64) | SELECT @@VERSION; |
| PostgreSQL | PostgreSQL 14.3 | SELECT VERSION(); |
| CUBRID | 11.2.0.0658 | SELECT VERSION(); |
방법
NULL 정의
TIBERO, ORACLE을 제외한 RDBMS에서는 '' (empty) 값을 NULL이 아닌 문자열로 취급합니다.
| INSERT VALUES | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 'NULL' | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 |
| ' ' | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 |
| '' | NULL | NULL | 문자열 | 문자열 | 문자열 | 문자열 | 문자열 |
주의
이기종 RDBMS간 데이터 마이그레이션 수행 시 주의사항 입니다.
- '' (empty)를 문자열로 취급한다면 TIBERO로 이관 수행 시 NOT NULL 테이블에 제약 위반이 발생합니다.
- 이관 전 협의가 진행 되어야 하며 협의가 되지 않은 상태에서 정상적인 이관을 수행하기에 어려움이 있습니다.
NULL 크기
| RDBMS | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| NULL (byte) | 0 or 1 | 0 | 0 | 0 | 0 | 0 | 0 or 선언 데이터 타입 크기 |
NULL 처리 방식
SELECT 절 NULL 연산
| NULL 연산 | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1 + NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1 – NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1 * NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 1 / NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
SELECT 절 NULL 문자 집합
| NULL 문자 접합 | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| 'A'||NULL||'C’ | AC | AC | NULL (연산) | NULL (연산) | - | NULL | NULL |
| 'A'+NULL+'C’ | NULL (연산) | ERROR | NULL (연산) | NULL (연산) | NULL | - | NULL |
| CONCAT('A',NULL,'C') | - | - | NULL | NULL | AC | AC | NULL |
| CONCAT('A',NULL) | A | A | NULL | NULL | A | A | NULL |
[*] NULL : 결과가 NULL로 처리되는 경우
[*] NULL(연산) : 결과가 NULL이나 문자 집합이 아닌 문자 연산
[*] - : 문법 제공하지 않음
TIBERO, ORACLE 모두 SELECT 절 +는 문자 연산으로 취급합니다.
결과가 다른 이유는 ORACLE의 경우 SELECT 절 연산을 수행할 경우 좌변의 값이 NUMBER인지 확인합니다.
TIBERO의 경우 좌변과 첫번째 우변을 바꿔 처리하면 ORACLE과 동일한 에러가 발생 합니다.
SELECT 절 날짜/시간 연산
| NULL 날짜 연산 | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| 날짜/시간 함수 + NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
NULL 집계함수
| TBL | |
| col1 | col2 |
| 1 | NULL |
| 2 | NULL |
| 3 | NULL |
| 4 | 40 |
| 5 | 50 |
| 집계함수 | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| COUNT(*) | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| COUNT(col1) | 5 | 5 | 5 | 5 | 5 | 5 | 5 |
| COUNT(col2) | 2 | 2 | 2 | 2 | 2 | 2 | 2 |
| SUM(col1) | 15 | 15 | 15 | 15 | 15 | 15 | 15 |
| SUM(col2) | 90 | 90 | 90 | 90 | 90 | 90 | 90 |
| SUM(col1+col2) | 99 | 99 | 99 | 99 | 99 | 99 | 99 |
| AVG(col1) | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
| AVG(col2) | 45 | 45 | 45 | 45 | 45 | 45 | 45 |
| AVG(col1+col2) | 49.5 | 49.5 | 49 | 49.5 | 49 | 49.5 | 49.5 |
- COUNT: NULL이 포함 컬럼으로 수행 시 NULL을 제외한 결과, COUNT(*)는 NULL을 제외하지 않음
- SUM: NULL 포함 컬럼으로 수행 시 NULL을 제외한 결과, 복합 결과 또한 NULL 제외
AVG: NULL 포함 컬럼으로 수행 시 NULL을 제외한 결과, 복합 결과 또한 NULL 제외
소수점 절삭은 RDBMS 성격에 따라 다르며 파라미터로 조정 가능합니다.
NULL 정렬
| ORDER BY | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| 숫자형: ORDER BY ASC | 높음 | 높음 | 낮음 | 낮음 | 낮음 | 높음 | 낮음 |
| 문자형: ORDER BY ASC | 높음 | 높음 | 낮음 | 낮음 | 낮음 | 높음 | 낮음 |
| 닐찌향: ORDER BY ASC | 높음 | 높음 | 낮음 | 낮음 | 낮음 | 높음 | 낮음 |
- RDBMS 마다 NULL 정렬의 차이가 높음과 낮음으로 분류되며 중간 값(모든 RDBMS 동일)은 없습니다.
- MIN/MAX 집계를 하거나 대소를 비교할 경우 NULL은 제외됩니다. (모든 RDBMS 동일)
NULL INDEX
| INDEX NULL 포함 | TIBERO | ORACLE | MySQL | MariaDB | SQL Server | PostgreSQL | CUBRID |
| INDEX 단일 | X | X | O | O | O | O | X |
| INDEX 복합 | O | O | O | O | O | O | O |
| 선택적 NULL 포함 | X | X | O | O | O | O | X |
- TIBERO, ORACLE, CUBRID 모두 단일 인덱스의 경우 NULL을 포함하지 않습니다.
- TIBERO, ORACLE의 경우 복합 인덱스 구성 시 단 1개의 컬럼이라도 NOT NULL 제약 조건이 있다면, INDEX에 NULL을 포함시킵니다. CUBRID의 경우 INDEX에 NULL 포함은 시키지만 INDEX SCAN에 활용되지 못합니다.
- 그 외 INDEX 단일, 복합 모두 포함시키는 RDBMS의 경우에는 NULL을 선택적으로 미포함, 포함시킬 수 있습니다. 단, 복합으로 구성 시 NOT NULL 제약 조건이 있는 컬럼이 있을 경우는 불가합니다.