MySQL에서 빈 문자열과 NULL은 다르다
PHP에서는 빈 문자열(empty string)과 NULL이 사실상 같은 값으로 취급되지만, MySQL에서는 상황이 다릅니다. 즉, 빈 문자열은 NULL과 동일하지 않습니다. 따라서 NOT NULL 제약 조건이 설정된 컬럼에도 빈 문자열은 정상적으로 삽입할 수 있습니다.
이를 실제 예제를 통해 확인해 보겠습니다.
1. 테스트 테이블 생성
먼저 Name 컬럼에 NOT NULL 제약 조건이 적용된 테이블을 생성합니다.
mysql> create table EmptyStringNotNullDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(10) not null,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.83 sec)
2. 데이터 삽입하기
이제 일반 문자열과 빈 문자열('')을 번갈아 삽입하여, NOT NULL 컬럼에 빈 문자열이 들어가는지 확인합니다.
mysql> insert into EmptyStringNotNullDemo(Name) values('John');
Query OK, 1 row affected (0.17 sec)
mysql> insert into EmptyStringNotNullDemo(Name) values('');
Query OK, 1 row affected (0.43 sec)
mysql> insert into EmptyStringNotNullDemo(Name) values('Carol');
Query OK, 1 row affected (0.12 sec)
mysql> insert into EmptyStringNotNullDemo(Name) values('');
Query OK, 1 row affected (0.13 sec)
mysql> insert into EmptyStringNotNullDemo(Name) values('');
Query OK, 1 row affected (0.16 sec)
mysql> insert into EmptyStringNotNullDemo(Name) values('Larry');
Query OK, 1 row affected (0.14 sec)3. 저장된 데이터 조회
SELECT 문으로 전체 레코드를 조회해 보면 다음과 같습니다.
mysql> select *from EmptyStringNotNullDemo;
실행 결과입니다.
+----+-------+
| Id | Name |
+----+-------+
| 1 | John |
| 2 | |
| 3 | Carol |
| 4 | |
| 5 | |
| 6 | Larry |
+----+-------+
6 rows in set (0.00 sec)
Name 컬럼이 NOT NULL로 선언되어 있음에도 불구하고, 빈 문자열이 오류 없이 정상적으로 삽입된 것을 확인할 수 있습니다.
4. 빈 문자열이 NULL인지 검증하기
그렇다면 이 빈 문자열이 실제로 NULL인지 아닌지는 어떻게 확인할 수 있을까요? IS NULL 연산자를 사용하면 됩니다. 결과가 0이라면 해당 값이 NULL이 아니라는 의미이고, 1이라면 NULL이라는 의미입니다.
mysql> select Name, Name IS NULL as EmptyValueIsNotNULL from EmptyStringNotNullDemo;
실행 결과입니다.
+-------+---------------------+
| Name | EmptyValueIsNotNULL |
+-------+---------------------+
| John | 0 |
| | 0 |
| Carol | 0 |
| | 0 |
| | 0 |
| Larry | 0 |
+-------+---------------------+
6 rows in set (0.00 sec)
모든 행의 결과가 0으로 출력되었습니다. 이는 빈 문자열로 저장된 값들조차 NULL이 아니라는 것을 명확하게 보여줍니다.
5. 사용자 정의 변수를 활용한 업데이트
참고로 사용자 정의 변수(user-defined variable)를 활용하면 컬럼 값을 빈 문자열로 일괄 업데이트할 수 있습니다. 기본 문법은 다음과 같습니다.
SET @anyVariableName=' ';
UPDATE yourTableName SET yourColumnName= @anyVariableName;
먼저 빈 문자열을 담은 사용자 변수를 선언합니다.
mysql> set @emptyStringValue="";
Query OK, 0 rows affected (0.00 sec)
이 변수를 사용해 테이블을 업데이트합니다.
mysql> update EmptyStringNotNullDemo set Name=@emptyStringValue;
Query OK, 3 rows affected (0.25 sec)
Rows matched: 6 Changed: 3 Warnings: 0
업데이트 후 전체 레코드를 다시 조회해 보겠습니다.
mysql> select *from EmptyStringNotNullDemo;
실행 결과입니다.
+----+------+
| Id | Name |
+----+------+
| 1 | |
| 2 | |
| 3 | |
| 4 | |
| 5 | |
| 6 | |
+----+------+
6 rows in set (0.00 sec)
Name 컬럼의 모든 값이 빈 문자열로 성공적으로 업데이트된 것을 확인할 수 있습니다.
정리
MySQL에서 NOT NULL 제약 조건은 NULL 값만 막는 것이며, 빈 문자열('')까지 막지는 않습니다. PHP와 달리 MySQL에서 빈 문자열과 NULL은 완전히 별개의 값이므로, 애플리케이션 개발 시 두 개념을 혼동하지 않도록 주의해야 합니다. 만약 빈 문자열 입력 자체를 방지하고 싶다면 CHECK 제약 조건이나 애플리케이션 레벨의 유효성 검증을 함께 적용하는 것이 좋습니다.