개요
'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 타입이 잘 생성이 되네요.
'개발 > 라라벨 Laravel' 카테고리의 다른 글
[라라벨 Laravel] PHP Fatal error: Uncaught ReflectionException: Class view does not exist in /vendor/laravel/framework/src/Illuminate/Container/Container.php (0) | 2019.03.02 |
---|---|
[라라벨 Laravel] Laravel debugbar (0) | 2019.02.21 |
[Laravel] Laravel 셋팅 과정 메모 (0) | 2019.02.21 |
[Laravel] Laravel 5.4 -> 5.5 메모 (0) | 2019.02.21 |
Laravel 에서 서비스 컨테이너 Service container 와 서비스 프로바이더 Service providers 의 개념에 대해서 (0) | 2018.06.10 |
[라라벨 Laravel] Artisan 의 migration 에 대해서 (Laravel 의 Artisan) (0) | 2018.04.08 |
[Laravel] 쿼리 빌더 사용 중에 쿼리 함수 이용할 때에 (0) | 2017.02.09 |
[Laravel] 쿼리 확인할 때 (0) | 2017.02.08 |