본문 바로가기
개발/라라벨 Laravel

[라라벨 Laravel][Mysql] String data, right truncated: 1406 Data too long for column 'content' at row 1

by 언제나초심. 2017. 7. 29.
반응형

개요 



'Query Exception SQLSTATE[22001]: String data, right truncated: 1406 Data too long for column 'content' at row 1'


에러가 자꾸 발생되어서 확인하게 되었습니다.


본문


Laravel 5.4.* 버전 사용중이고, PHP 7.1.* 사용중이고, Mysql 은 5.5.* 버전 사용중입니다. 문제가 뭘까? 고민해봤는데


이 경우에는 text 타입이 문제였습니다. 길이가 긴 문자열을 넘기게 되었는데, 저장할 수 있는 크기를 넘어섰기 때문에 발생하였습니다.


Laravel 의 기본 샘플을 따라서 테스트 하는 중에 생성했던 테이블의 컬럼 중에 text 타입이 문제가 있었던 것으로 보입니다. 


제 경우에는 posts 테이블의 content 컬럼의 데이터 타입이 'text' 였는데, 그 이유는 Laravel 에서 migration 코드 (데이터베이스 스키마 생성 코드 or 클래스)에서 $table->text('content') 로 되어져 있었기 때문입니다. 


컬럼 타입을 변경해야겠네요. 



어느 타입을 선택해야 할까?

mysql 의 친절한 doc API 를 살펴봅시다. (사실은 안 친절함...)


https://dev.mysql.com/doc/refman/5.7/en/string-type-overview.html



정리해보자면, 



String Text 타입들

  - TINYTEXT 255 bytes (2^8-1)

  - TEXT 65,535 bytes (2^16 -1) => 약 64KB

  - MEDIUMTEXT 16,777,215 bytes (2^24-1)  => 약 16MB

  - LONGTEXT 4,294,967,295 bytes (2^32-1) => 약 4GB



BLOB 타입은? (혹시 모르니 살펴봄)

   - TINYBLOB 255 bytes (2^8-1)

   - BLOB 65,535 bytes (2^16 -1) => 약 64KB

   - MEDIUMBLOB 16,777,215 bytes (2^24-1) => 약 16MB

   - LONGBLOB 4,294,967,295 bytes (2^32-1) => 약 4GB



이라고 볼 수 있겠네요. 일단 text 계열에서는 longtext 가 가장 길기 때문에, longtext 로 할까 생각이 듭니다. 


최근 데이터베이스의 확장형 컬럼들 (CLOB, BLOG 등등) 의 경우에는, 저장 공간을 별도로 이용하는 대신에, 사용된 크기만큼만 용량을 차지하는 것으로 알고 있습니다. (즉 포인터를 이용하는 것처럼 데이터의 좌표값만을 갖고 있고, 데이터는 다른 공간에 저장하는 방식이라고 생각이 듭니다)


longtext 를 사용한다고 해서, 4GB 를 바로 차지하지는 않을 것으로 보입니다. 최대로 누군가 저장을 해버리면 4GB 가 될 수는 있겠네요. 저만 사용하는 사이트였기 때문에, longtext 를 이용하기로 하였습니다. 



다른 솔루션의 경우는 어떤지 궁금해졌습니다. 직접 설치해보고 테이블의 컬럼을 살펴보았는데 다음과 같았습니다. (제가 갖고있던 버전으로 설치한 것이므로, 최신 버전이라면 다를 수 있습니다)

- 미디어위키 : mediumblob 

- 그누보드5  : longtext

- 제로보드XE : longtext

- 워드프레스 : longtext



결론

프로그램으로 직접 열어서, 테이블의 컬럼 타입을 longtext 로 변경해주었습니다. 이상없이 되는군요.



여담

혹시 모르니, laravel 의 migration 파일에도



$table->longText('content');


으로 변경해두었습니다. 테스트로 실행을 해보니 longtext 타입이 잘 생성이 되네요.

반응형