[MySQL] BLOB, TEXT 데이터 형식 by Sigel

내가 담당하는 프로젝트(프로그램?? 암튼..) 중에 MySQL을 사용하는 서비스가 하나 있다. 여기에 갑자기 대용량의 필드를 추가할 일이 생겼다. 그래서 간만에 찾아보게 되었다.


MySQL도 대용량의 데이터를 저장할 수 있는 데이터 형식(data type)을 지원한다. BLOB과 TEXT가 그것이다. Oracle의 BLOB과 CLOB으로 볼 수 있으며, 예전에는 TEXT만 있었는데 BLOB은 언제 생겼는지 모르겠다. 워낙 오래전에 봤던 내용이라 =ㅅ=;;; 그래서 다시 보게 됐다.

BLOB과 TEXT의 차이점은..
1. MySQL의 BLOB은 "binary large object"의 약자로 binary 형태의 데이터(byte strings)를 저장하기에 적당하고, TEXT는 문자셋(Character set)에 대한 내용을 포함하기 때문에 문자형태의 데이터(character strings)를 저장하기에 적당하다.
2. BLOB은 정렬 시에 저장된 숫자값 기반으로 정렬을 수행하고, TEXT는 문자집합을 고려하여 정렬한다.
3. TEXT 필드에 인덱스(index)가 지정되어 있으면, 내용 비교 시에 마지막에 붙은 공백(trailing-space)은 무시된다. unique와 같이 인데스 비교를 하는 테이블에 "a"가 들어있다고 하자. 이 때, "a "를 넣으려고 하면 중복 오류(duplicate-key)가 발생하는 것이다. 하지만, BLOB은 그렇지 않다.

비슷한 점이라면..
문자열이 저장할 수 있는 공간보다 길어지면 문자열은 짤려서 저장되고, WARNING을 발생시킨다.


그리고 BLOB, TEXT와 비슷한 VARBINARY와 VARCHAR를 비교해 보자.
1. trailing-space의 제거 여부
BLOB과 TEXT는 문자열의 마지막에 붙은 공백(trailing-space)을 제거하지 않는다. 하지만, 5.0.3 이전 버전의 MySQL은 VARBINARY와 VARCHAR는 문자열 마지막의 공백을 제거했다. "a "를 넣으면 "a"가 되는 것이다.
2. BLOB과 TEXT는 index로 지정할 때 인덱스로 사용할 문자 길이인 index prefix length를 지정해 주어야 한다. CHAR와 VARCHAR의 경우는 옵션이다. (인덱스에 대해서는.. 7.4.3. Column Indexes)
3. BLOB과 TEXT는 DEFAULT를 설정할 수 없다.


BLOB과 TEXT는 최대 사이즈에 따라 종류가 있다.
BLOB에는 TINYBLOB, BLOB, MEDIUMBLOB, LONGBLOB이 있고, TEXT에는 TINTTEXT, TEXT, MEDIUMTEXT, LONGTEXT가 있다. BLOB과 TEXT는 2의 16제곱 바이트 가량을 담을 수 있다. (Data Type Storage Requirements의 Storage Requirements for String Types 부분 참조) LONG과 LONGVARCHAR는 MEDIUMTEXT와 매칭된다.


참고 문서
MySQL 5.0 Reference Manual 10.4.3. The BLOB and TEXT Types






Posted by linuxism
,