티스토리 뷰
대부분의 RDBMS 데이터베이스에 이미지 파일을 저장할때는 BLOB 형식이 사용됩니다.
Informix에서는 BYTE 와 BLOB 형식에 저장하는데요. Informix의 BYTE 컬럼에 저장된 이미지 파일의 확장자를 구분하는 방법을 정리해 보겠습니다.
Informix의 BYTE 컬럼의 데이터는 아래와 같이 SELECT 문장으로 확인할 수 없기 때문에, TEXT 타입으로 변환한 후 조회하는 방법을 시도해봤습니다. 이렇게 하면 바이너리 파일을 텍스트 에디터로 여는 것과 같은 결과가 나오죠.
그러면 파일의 시작부분에서 확장자임을 나타내는 문자열을 확인할 수 있습니다. 이와 관련하여 제가 참조한 포스팅은 하단의 링크를 참고해주세요.
$ echo "select cat_picture[1,2] from catalog_copy1 where catalog_num=10001" | dbaccess stores_demo
cat_picture <BYTE value>
1 row(s) retrieved.
$ echo "select cat_picture[1,2]::text from catalog_copy1 where catalog_num=10001" | dbaccess stores_demo
(expression)
GI
1 row(s) retrieved.
이렇게 확인할 수도 있지만 TEXT 타입은 CHAR , VARCHAR 형식으로 변환할 수 없어 여러 건의 데이터를 확인하기 위한 조건절로 사용할 수가 없습니다. DataBlade라는 모듈을 설치해서 TEXT 타입의 데이터를 VARCHAR 형식으로 반환하기 위한 함수를 사용할 수 있습니다.
> EXECUTE FUNCTION sysbldprepare('excompat.1.0','create');
(expression)
0
1 row(s) retrieved.
위와 같이 DataBlade 모듈을 설치하면 LOB 데이터를 처리할 수 있는 함수들이 생성되어 사용할 수 있습니다. 그 중에 LOB 데이터의 일부를 추출할 수 있는 DBMS_LOB_SUBSTR 함수를 사용하여 위와 동일한 결과를 얻었습니다.
echo "select dbms_lob_substr(cat_picture::text,2) from catalog_copy1 where catalog_num=10003" | dbaccess stores_demo
(expression)
BM
1 row(s) retrieved.
위와같은 방법으로 GIF, JPG, PNG등의 형식도 확인할 수 있습니다. 제가 확인한 방법은 아래 네가지 입니다.
함수 실행 방법 | 함수 실행 결과 | 이미지 파일 확장자 |
DBMS_LOB_SUBSTR(컬럼명::TEXT,2) | BM | BMP |
DBMS_LOB_SUBSTR(컬럼명::TEXT,2) | GI | GIF |
DBMS_LOB_SUBSTR(컬럼명::TEXT,2,3) | NG | PNG |
DBMS_LOB_SUBSTR(컬럼명::TEXT,4,7) | JFIF | JPG |
위에서 언급한 포스팅에 게시한 분께서도 말씀하셨듯이 일종의 편법이지만, 쿼리로 간단히 확인할 수 있어 유용하네요.
다른 DBMS에서도 이와 대응되는 데이터 타입이 있다면 응용해서 사용할 수 있을 것 같습니다.
- Total
- Today
- Yesterday