Computer >> 컴퓨터 >  >> 프로그래밍 >> MySQL

MySQL ERROR 1406 해결 방법: 열에 비해 데이터가 너무 깁니다(Data too long for column)

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)

실제 출력 화면은 아래와 같습니다.

MySQL ERROR 1406 해결 방법: 열에 비해 데이터가 너무 깁니다(Data too long for column)

오류가 발생하는 경우

앞서 설명한 것처럼, 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)

실제 출력 화면은 아래와 같습니다.

MySQL ERROR 1406 해결 방법: 열에 비해 데이터가 너무 깁니다(Data too long for column)

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자보다 긴 문자열을 삽입할 때도 동일한 오류가 발생하므로, 애플리케이션 단에서 입력값 길이를 검증하는 것이 좋습니다.