2014년 3월 24일 월요일

MySQL BLOB, TEXT size limit

테스트를 진행하던 중에 textarea 값을 DB로 던졌더니 무시무시한 500 에러가 떨어졌다.

내용을 보니 INSERT 시에 컬럼의 제한보다 긴 문자열이 INSERT를 시도해서 발생한 에러였다.

문제가 된 컬럼을 확인하니 데이터 타입은 TEXT.

헐?

도대체 얼마나 긴 문자를 집어 넣었길래 이런 문제가 발생했을까..

입력한 문자들이 HTML형태로 변환되기에 입력 값이 조금 많을 것이라는 예상을 했지만..

TEXT 타입의 제한을 넘겨버릴 줄은 생각도 못했다.

에러를 발생시킨 장본인을 찾아갔더니..

첨부파일 기능이 없어서 PDF의 내용을 모두 복사시킨 후 붙여넣었다고 한다..

그랬더니 이렇게 에러가 떨어졌다고..

이런젠장

 

그래요..예외처리를 하지 않은 개발자 잘못이죠 ㅠㅠ

MySQL의 BLOB과 TEXT는 아래와 같은 사이즈로 저장이 된다.








TINYBLOB, TINYTEXT       L + 1 bytes, where L < 2^8    (255 Bytes)

BLOB, TEXT               L + 2 bytes, where L < 2^16   (64 Kilobytes)

MEDIUMBLOB, MEDIUMTEXT   L + 3 bytes, where L < 2^24   (16 Megabytes)

LONGBLOB, LONGTEXT       L + 4 bytes, where L < 2^32   (4 Gigabytes)


TEXT 타입은 UTF-8이 3바이트씩 저장된다고 할 때, 한 2만자는 넘게 저장할 수 있는 크기다.

그 이상의 길이를 저장하기 위해서는 MEDIUMTEXT 타입으로 수정해야 하지만..

64K의 저장공간에서 16M의 저장공간으로 증가하는 것은 저장공간에 있어서 엄청난 타격을 입게 된다.

신중히 결정해야할 사항이다..

그래서 나는 약 64K 이상의 문자를 입력받으면 문자열 길이에 대한 경고를 출력하도록 수정하였으며, (실제로는 여유있게 약 50K)

첨부파일을 첨부할 수 있도록 변경하였다.

댓글 없음:

댓글 쓰기