MySQL에서 NULL과 빈 문자열의 차이
InnoDB 스토리지 엔진에서는 NULL 값이 빈 문자열('')보다 적은 공간을 차지합니다. 또한 NULL의 길이는 'null'로 평가되는 반면, 빈 문자열의 길이는 0입니다.
이를 직접 확인하기 위해 CREATE 명령어로 테스트용 테이블을 생성해 보겠습니다.
mysql> CREATE table DemoEmptyAndNULL
-> (
-> Message varchar(100)
-> );
Query OK, 0 rows affected (0.49 sec)
테이블 생성이 완료되면 INSERT 명령어를 사용하여 빈 문자열 레코드를 삽입합니다.
mysql> INSERT into DemoEmptyAndNULL values(' ');
Query OK, 1 row affected (0.17 sec)레코드가 삽입된 후 SELECT 명령어로 전체 레코드를 조회할 수 있습니다.
mysql> SELECT * from DemoEmptyAndNULL;
위 쿼리를 실행하면 다음과 같은 결과가 출력됩니다.
+---------+
| Message |
+---------+
| |
+---------+
1 row in set (0.00 sec)
빈 문자열의 count() 확인
내장 함수인 count()를 사용하여 빈 문자열이 어떻게 계산되는지 확인하는 기본 구문은 다음과 같습니다.
select count(column_name) from yourTableName;
이 구문을 적용하여 빈 문자열 레코드의 개수를 확인해 보겠습니다.
mysql> select count(message) from DemoEmptyAndNULL;
쿼리 실행 결과는 다음과 같습니다.
+----------------+
| count(message) |
+----------------+
| 1 |
+----------------+
1 row in set (0.06 sec)
위 결과에서 알 수 있듯이 빈 문자열은 count() 함수에서 유효한 값으로 간주되어 1로 계산됩니다.
NULL의 count() 확인
이제 NULL의 경우를 살펴보겠습니다. 먼저 DELETE 명령어로 앞서 삽입한 레코드를 삭제합니다.
mysql> delete from DemoEmptyAndNULL where message=' ';
Query OK, 1 row affected (0.19 sec)
다음 쿼리로 테이블에 현재 레코드가 없음을 확인할 수 있습니다.
mysql> SELECT * from DemoEmptyAndNULL;
Empty set (0.00 sec)
이번에는 NULL 값을 가진 레코드를 테이블에 삽입합니다.
mysql> INSERT into DemoEmptyAndNULL values();
Query OK, 1 row affected (0.18 sec)
SELECT 명령어로 레코드를 조회하면 다음과 같은 결과를 얻을 수 있습니다.
+---------+
| Message |
+---------+
| NULL |
+---------+
1 row in set (0.00 sec)
현재 테이블에는 NULL 값을 가진 레코드 하나만 존재합니다. 해당 레코드의 개수를 확인하는 쿼리는 다음과 같습니다.
mysql> select count(message) from DemoEmptyAndNULL;
쿼리 실행 결과는 다음과 같습니다.
+----------------+
| count(message) |
+----------------+
| 0 |
+----------------+
1 row in set (0.00 sec)
위 출력 결과는 NULL 값일 때 count가 0으로 집계됨을 의미합니다. 즉, count() 함수는 NULL을 대상에서 제외합니다.
참고로 이 실습에 사용된 MySQL 버전은 다음과 같습니다.
mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.12 |
+-----------+
1 row in set (0.06 sec)
NULL과 빈 문자열 중 무엇을 선택해야 할까?
결론부터 말하면, 일반적인 경우 데이터베이스 설계 시 빈 문자열을 사용하는 것이 권장됩니다. NULL 값을 허용하면 시스템이 추가적인 처리 작업을 수행해야 하며, 쿼리 작성 시 IS NULL 조건 등을 별도로 고려해야 하기 때문입니다. 특히 count() 함수나 WHERE 절에서 NULL은 예상과 다른 결과를 가져올 수 있습니다.
다만 NULL은 count() 함수 실행 시 오류나 예외를 발생시키지 않고 단순히 집계에서 제외되므로, "값이 존재하지 않음"이라는 상태를 빈 문자열과 명확히 구분해야 하는 경우에는 여전히 유용하게 활용할 수 있습니다. 따라서 컬럼의 성격과 비즈니스 요구 사항에 따라 신중하게 선택하는 것이 중요합니다.