테이블의 NULL 허용 필드에 데이터를 넣을 때 빈 문자열(empty string)을 넣으면 어떻게 될까요? 아래의 두가지 쿼리가 어떻게 동작할지를 말하는 것입니다.
INSERT INTO tb_test (id, name) VALUES (1, NULL);
INERRT INTO tb_test (id, name) VALUES (2, '');
1. Oracle
오라클에서는 NULL과 빈문자열 '' 이 모두 NULL 로 처리 됩니다. 위에서 id 가 1, 2 인 행의 name은 모두 NULL 이 들어갑니다.
SELECT * FROM tb_test WHERE name IS NULL;
위와 같이 쿼리하면 id가 1, 2인 행이 모두 조회됩니다. 데이터베이스에서 NULL은 등호(=)로 비교할 수 없습니다. 반드시 IS NULL 또는 IS NOT NULL 을 사용해서 판별하여야 합니다.
값이 NULL인 문자열의 길이는 얼마가 나올까요?
SELECT LENGTH(name) FROM tb_test WHERE name IS NULL;
답은 NULL 입니다. 데이터베이스에서 NULL을 다룰 때는 항상 주의해야 합니다. 계산에 NULL 이 사용 되면 0처럼 동작하는것이 아니라 결과가 NULL이 되어 버립니다.
2. MySQL(MariaDB)와 SQLServer
MySQL(MariaDB)와 마이크로소프트의 SQLServer에서는 빈 문자열이 입력됩니다.
SELECT * FROM tb_test WHERE name = '';
위와 같이 조회 하면 id가 2인 행이 나옵니다.
SELECT * FROM tb_test WHERE name IS NULL;
이렇게 조회 하면 id가 1인 행이 나옵니다.
각각에서 빈 문자열 필드의 길이를 구해보면 0이 나오게 됩니다.
-- MySQL
SELECT LEN(name) FROM tb_test WHERE name = '';
-- SQLServer
SELECT LENGTH(name) FROM tb_test WHERE name = '';
데이터베이스 NULL 을 잘 다루는 것은 매우 중요합니다. 데이터베이스에서 값을 조회한 프로그램에서 오류를 낼 수 도 있고, 계산등에서 값이 맞지 않을 수도 있기 때문입니다.
반응형
'프로그래밍 > 데이터베이스' 카테고리의 다른 글
Oracle 툴에서 & 입력 또는 조회하기 (2) | 2018.04.20 |
---|---|
mysqldump를 사용하여 MySQL(MariaDB)백업하기 (2) | 2018.04.20 |
MySQL locking - Table-Level Locking, Row-Level Locking, Optimistic Locking (4) | 2018.04.20 |
Oracle에서 VARCHAR2 컬럼을 CLOB으로 변경하기 (0) | 2018.04.20 |
Windows 10에 MariaDB 설치하기 (14) | 2018.04.19 |