(mysql) Data truncation: Data too long for column 'xxx' at row 1

mysql 데이터 넣는 부분에서 발생한 문제인데 xxx 는 내가 지정한 컬럼명이다. 

Data truncation: Data too long for column ‘xxx‘ at row 1

xxx 에 들어갈 데이터가 너무 크다는 이야기. TEXT 형으로 잡았었는데, 문제가 생겨서 보니 해당 필드는 어떤 웹 페이지 전체가 들어가는 컬럼이었다. TEXT도 적을까 해서 일단은 LONGTEXT 라는 형이 있어서 문제는 해결되긴 하였다. 

mysql 형 TEXT, LONGTEXT 에 대해서 찾아본  것을 정리한다.

4가지 TEXT 형이 있는데, 사이즈에 따라서 분류가 된다. 

 데이터 타입

 필요저장공간 

 최대저장가능 바이트수  

 TINYTEXT

 데이터바이트수 + 1 바이트

 255

 TEXT

 데이터바이트수 + 2 바이트

 64,535

 MEDIUMTEXT

 데이터바이트수 + 3 바이트

 16,777,215

 LONGTEXT

 데이터바이트수 + 4 바이트

 4,294,967,295


mysql의 TEXT타입은 오라클의 CLOB라고 하는 대용량 타입과 동일한 역할.

사용해야 하는 경우

– 해당 컬럼에 저장되는 내용을 예측할수 없는 크기일 경우

– 레코드의 전체크기가 64KB 를 넘어서서 더 큰 컬럼을 추가할수 없는 경우, 일부컬럼을 TEXT 로 대체 

인덱스 생성 관련

– TEXT 타입 컬럼에 대한 인덱스 생성시, 몇 바이트까지 인덱스 생성할것인 고려 필요.

– 문자집합의 만큼만 생성 가능.

정렬 관련

– 정렬 작업시, 컬럼 저장이 10MB저장되어 있더라도 mysql 서버의 max_sort_length 값만큼만 정렬을 수행

– 좀더 빠른 정렬을 위해서는 값을 줄이는 방법이 좋다.

기타 사항

– 임시 테이블 사용시, MEMORY 스토리지 엔진 사용시 TEXT 사용 불가. 

– SELECT로 컬럼대상 조회시 전체 조회보다는 일부 조회시, CAST(), SUBSTRING() 함수를 이용해서 VARCHAR 로 변경해서 조회하는 것이 좋을수도 있음. 

– INSERT, UPDATE 문장시, SQL자체가 길어지는 문제가 있을수 있는데, 이 경우 mysql 의 max_allowed_packet 설정에 따라서 이 값보다 크면 오류가 발생된다. 이런 경우 수정을 통해서 충분히 늘려주는 것이 좋다.