MySQL ERROR 1406, 왜 발생할까요?
ERROR 1406 (22001): Data too long for column 오류는 열에 허용된 크기보다 더 긴 데이터를 저장하려고 시도할 때 발생합니다. 대표적인 사례가 바로 BIT 타입 열입니다. BIT 타입은 비트 값만 저장할 수 있는데, 여기에 일반 문자열을 그대로 넣으려고 하면 varchar나 문자열 데이터가 BIT 데이터 타입보다 크기를 차지하기 때문에 이 오류가 나타납니다.
해결 방법: b 접두사 붙이기
BIT 타입 열에는 반드시 아래와 같은 문법으로 값을 지정해야 합니다.
anyBitColumnName = b'1' 또는 anyBitColumnName = b'0'
실전 예제
위 문법을 이해하기 위해 실제 테이블을 만들어 보겠습니다. 테이블 생성 쿼리는 다음과 같습니다.
mysql> create table ErrorDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(10),
-> isStudent BIT,
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.70 sec)이어서 insert 명령으로 여러 개의 레코드를 삽입합니다.
mysql> insert into ErrorDemo(Name,isStudent) values('John',1);
Query OK, 1 row affected (0.18 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Sam',0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Mike',0);
Query OK, 1 row affected (0.16 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Larry',1);
Query OK, 1 row affected (0.23 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Carol',1);
Query OK, 1 row affected (0.11 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Robert',0);
Query OK, 1 row affected (0.17 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('James',1);
Query OK, 1 row affected (0.18 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Bob',1);
Query OK, 1 row affected (0.19 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('David',1);
Query OK, 1 row affected (0.15 sec)
mysql> insert into ErrorDemo(Name,isStudent) values('Ricky',0);
Query OK, 1 row affected (0.17 sec)select 문으로 테이블의 모든 레코드를 조회해 보겠습니다.
mysql> select *from ErrorDemo;
실행 결과는 다음과 같습니다.
+----+--------+-----------+ | Id | Name | isStudent | +----+--------+-----------+ | 1 | John | | | 2 | Sam | | | 3 | Mike | | | 4 | Larry | | | 5 | Carol | | | 6 | Robert | | | 7 | James | | | 8 | Bob | | | 9 | David | | | 10 | Ricky | | +----+--------+-----------+ 10 rows in set (0.00 sec)
실제 출력 화면은 아래와 같습니다.

오류가 발생하는 경우
앞서 설명한 것처럼, BIT 열에 따옴표로 묶인 문자열 '1'을 그대로 넣으면 아래 쿼리 실행 시 오류가 발생합니다.
mysql> update ErrorDemo set isStudent='1' where Id=9; ERROR 1406 (22001): Data too long for column 'isStudent' at row 1
오류 해결하기
위 오류를 피하려면 '1' 앞에 b를 붙여 비트 리터럴임을 명시해야 합니다. 수정된 쿼리는 다음과 같습니다.
mysql> update ErrorDemo set isStudent=b'1' where Id=9; Query OK, 0 rows affected (0.00 sec) Rows matched: 1 Changed: 0 Warnings: 0
다시 select 문으로 테이블 레코드를 확인해 보겠습니다.
mysql> select *from ErrorDemo;
실행 결과는 다음과 같습니다.
+----+--------+-----------+ | Id | Name | isStudent | +----+--------+-----------+ | 1 | John | | | 2 | Sam | | | 3 | Mike | | | 4 | Larry | | | 5 | Carol | | | 6 | Robert | | | 7 | James | | | 8 | Bob | | | 9 | David | | | 10 | Ricky | | +----+--------+-----------+ 10 rows in set (0.00 sec)
실제 출력 화면은 아래와 같습니다.

isStudent 열을 주목해서 확인해 보세요.
b'0'으로 값 갱신하기
이번에는 같은 Id에 값 0을 넣어 업데이트해 보겠습니다. 해당 Id의 isStudent 값은 빈 값으로 표시됩니다.
mysql> update ErrorDemo set Name='Maxwell', isStudent=b'0' where Id=9; Query OK, 1 row affected (0.16 sec) Rows matched: 1 Changed: 1 Warnings: 0
방금 업데이트한 행(Id 9)의 레코드를 다시 조회합니다.
mysql> select *from ErrorDemo where Id=9;
실행 결과는 다음과 같습니다.
+----+---------+-----------+ | Id | Name | isStudent | +----+---------+-----------+ | 9 | Maxwell | | +----+---------+-----------+ 1 row in set (0.00 sec)
정리 및 추가 팁
지금까지 살펴본 것처럼 MySQL ERROR 1406은 열의 데이터 타입이 허용하는 범위를 벗어난 값을 저장하려 할 때 발생합니다. BIT 타입 열에는 반드시 b'1', b'0' 형태의 비트 리터럴을 사용하세요.
추가로 참고하면 좋은 내용은 다음과 같습니다.
- sql_mode 설정: strict 모드(STRICT_TRANS_TABLES)가 활성화되어 있으면 오류가 발생하고, 비활성화되어 있으면 데이터가 잘리고 경고만 표시될 수 있습니다.
- 열 구조 미리 확인:
DESCRIBE 테이블명;또는SHOW CREATE TABLE 테이블명;으로 각 열의 데이터 타입과 최대 크기를 사전에 확인하면 이런 오류를 예방할 수 있습니다. - varchar 길이 초과: varchar(n) 열에 n자보다 긴 문자열을 삽입할 때도 동일한 오류가 발생하므로, 애플리케이션 단에서 입력값 길이를 검증하는 것이 좋습니다.