티스토리 뷰

"Data truncation: Data too long for column" causes

이 에러는 언제 발생하는가?

테이블 생성 시 선언한 데이터 크기를 벗어날 때 발생한다

또 하나가 있다, 데이터 타입의 크기를 줄이고자 할 때 기존에 줄이려는 크기를 초과하는 데이터가 있을 때도 발생한다

 

업무 중 요구사항으로 200자 제한이 있던 컬럼의 길이를 100자로 제한해야 한다는 것이 발생했다

단순한 코드, DB 작업으로 끝낼 수 있겠거니 생각하고 넘기려던 차에 혹시 모르니 GPT에게 물어봤다

질문은 varchar(200)으로 선언한 컬럼을 varchar(100)으로 줄일 수 있느냐,

그리고 이미 100자를 초과하는 데이터가 있는데도 문제없이 작동하느냐고 물었다

GPT는 당당하게 아래와 같이 답했다

GPT 왈
100자를 초과하는 데이터가 있더라도 에러는 발생하지 않으며
제약을 변경하는 것이 기존 데이터를 수정하지는 않는다

 

뭔가 찜찜해서 출처를 물었더니 공식 문서의 ALTER TABLE STATEMENT 절까지 첨부해 줘서 거의 믿을 뻔했다

아무리 봐도 답해준 공식 문서에는 문제없다는 내용을 찾을 수 없었고

GPT의 구라에 한두 번 당해본 게 아니기 때문에 검증 들어간다

 

MySQL :: MySQL 8.0 Reference Manual :: 13.1.9 ALTER TABLE Statement

13.1.9 ALTER TABLE Statement ALTER TABLE tbl_name [alter_option [, alter_option] ...] [partition_options] alter_option: { table_options | ADD [COLUMN] col_name column_definition [FIRST | AFTER col_name] | ADD [COLUMN] (col_name column_definition,...) | AD

dev.mysql.com

 

1. varchar(20)으로 선언한 테이블 생성

2. 20자 꽉 채워 데이터를 삽입

3. 데이터 확인

4. varchar(10)으로 변경

5. "Data truncation: Data too long for column" 에러 발생

 

공식 문서에 해당 내용이 있는지 구글링을 해봤는데 데이터 길이를 변경하라는 허접한 답변들만 나오고 답을 찾진 못 했다

공식 문서를 좀 더 뒤져보거나 DBA한테 해당 내용에 대한 자료가 있는지 물어봐야겠다

어쨌건 이미 저장된 데이터의 길이보다 작게 줄일 수 없다

여기서 끝내면 허접한 결론이니 좀 더 나아가보자

 

문득 MySQL에서 Alter table 칠 때 테이블을 새로 작성한다는 내용이 머리를 스쳤다

데이터 중심 애플리케이션 설계 책을 보다가 읽은 기억이 있어 좀 더 찾아봤다

아래 글을 참고해 보면 Alter table은 3가지 방식이 있다고 한다

1. COPY

2. INPLACE

3. INSTANT

 

ALTER TABLE in MySQL: Friend or Foe? | Severalnines

The MySQL ALTER TABLE statement is used to add, delete, or modify columns in an existing table as well as to add and drop various constraints on an existing table. In this blog post we discuss the advantages and disadvantages of using the ALTER TABLE in My

severalnines.com

 

COPY는 말 그대로 전체 데이터 복사 후 재작성, 테이블 크기가 큰 경우 오버헤드가 엄청날 것이다

INPLACE, INSTANT는 DDL 수행 중 MySQL 8.0.12에 도입된 Concurrent DML이 지원된다

INPLACE는 COPY를 피하기 위한 방식이지만 테이블 재작성하는 것은 마찬가지며 아주 짧은 시간만 배타 락을 잡는다

INSTANT는 배타 락을 아예 잡지 않고 즉각적으로 변경할 수 있는데 테이블의 메타데이터만 변경하기 때문이다

테이블의 메타데이터란 database objects, tables, columns, indexes, privileges 등의 상세 정보를 의미한다

 

COPY, INPLACE 차이

COPY는 데이터를 복사한 후 새로운 공간에 테이블을 만들기 때문에 오버헤드가 심하고

INPLACE는 데이터 복사를 피하기 위해 공간을 그대로 사용하지만 테이블을 재작성하며 메타데이터를 변경한다

더 자세히 알고 싶다면 공식 문서를 참고하자

 

MySQL :: MySQL 8.0 Reference Manual :: 15.12.2 Online DDL Performance and Concurrency

MySQL 8.0 Reference Manual  /  ...  /  The InnoDB Storage Engine  /  InnoDB and Online DDL  /  Online DDL Performance and Concurrency 15.12.2 Online DDL Performance and Concurrency Online DDL improves several aspects of MySQL operation: Applicatio

dev.mysql.com

 

'아 그렇구나' 하고 멈췄다면 찾지 못 했을 것들을 계속 찾다 보니 공식 문서에 답이 없더라도 이해가 된다

테이블을 재작성하게 되니 컬럼 길이를 줄일 수 없다는 것이 너무나 명백하다

기존 테이블의 데이터를 새로 테이블 작성 후 삽입을 해줘야 하는데 

컬럼 길이가 맞지 않는 데이터가 있으므로 에러가 터질 것이고 

그것이 바로 "Data truncation: Data too long for column"와 내가 만난 이유일 것이다

GPT를 너무 믿지 말자, 믿더라도 검증은 해보자

'DB' 카테고리의 다른 글

[MySQL 8.0.26] explain format=tree는 어디 갔는가  (2) 2021.12.29
댓글
링크
글 보관함
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Total
Today
Yesterday