2014-12-08 4 views
1

고객 데이터가 포함 된 MSSQL 2008 데이터베이스에 액세스하는 CGI 응용 프로그램을 업데이트하고 있습니다. 데이터베이스는 타사 응용 프로그램에서 관리하므로 데이터 구조를 변경할 수 없습니다.MSSQL 이미지 데이터가 텍스트로 반환됩니다.

테이블 ('손님') 중 하나에는 '이미지'유형의 'mug_shot'열이 있습니다. 열에는 각 게스트의 JPEG 이미지가 포함됩니다. 이 열에서 데이터를 검색 할 때 항상 텍스트 형식으로 나타납니다. 예를 들어, 나는 다음과 같은 쿼리를 수행 할 때 :

my $mugshotQuery = "SELECT TOP 1 mug_shot FROM guests where guest_no = ?"; 
my $mugshotStatementHandle = $dbh->prepare($mugshotQuery); 
$mugshotStatementHandle->execute($guest_number); 

을하고 데이터를 가져 오기 :

my $mugshotHash = $mugshotStatementHandle->fetchrow_hashref(); 

$mugshotHash->{mug_shot}은 JPEG 이진 데이터의 16 진수 표현이 포함되어 있습니다. 여기에 단축 예는 다음과 같습니다

ffd8ffe000104a46494600010101004c004c0000ffe1004245786966000049492a000800000002001a01050001000000260000001b0105000100000030000000000000007d3b8c0440420f000000ed168e0440420f000000ffdb0043000302020302020303030304030304050805050404050a070706080c0a0c0c0b0a0b0b0d0e12100d0e110e0b0b1016101113141515150c0f171816141812141514ffdb00430103040405040509050509140d0b0d1414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414141414ffc00011080156010003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00bd3dc482790798ff0078ff0011f5a68b9931feb1ff0033493f133f7f98ff003a6923d39aed48f997e63fed1267fd63 

따라서, 이미지를 표시하는 나의 시도가 실패 :

print STDOUT "Content-type: image/jpeg\n"; 
print STDOUT "Content-length: \n\n"; 
binmode STDOUT; 
print STDOUT $mugshotHash->{mug_shot}; 

브라우저는 이미지가 잘못되었음을보고합니다. 데이터가 이진 데이터 대신 텍스트/16 진수로 반환되는 이유는 무엇입니까? 이진 데이터를 가져 오려면 어떻게해야합니까?

+1

, 나는 데이터베이스에 BLOB/이미지 데이터를 저장하는 함정 익숙하고 변경합니다 : 좋은 측정을 위해, 나는 또한이 이미지가 잘립니다되지 않도록하려면 다음을 사용 내가 할 수 있다면 스토리지 구조. 불행히도,이 경우에는 옵션이 아닙니다. –

+0

아마도이 열은 이진수가 아닌 char로 바인딩 되었기 때문에 발생했을 것입니다. 이것은 두 가지 이유로 발생할 수 있습니다. 1. 사용중인 DBD :: ODBC 버전이 너무 오래되었습니다. 2. DBD :: ODBC는 열 유형을 인식하지 못하므로 char로 바인딩합니다. DBD :: ODBC 버전을 알고 있어야하며 DBD :: ODBC는 열 유형으로 간주합니다. DBI_TRACE = 15 = x.log를 먼저 설정하면 디버그가 x.log에 기록됩니다. – bohica

+0

@bohica 올바른 방향으로 나를 가리켜 주셔서 감사합니다. '$ dbh -> {syb_binary_images} = 1; –

답변

0

바이너리 형식으로 이미지 데이터를 반환하는 플래그가있다 :

$dbh->{syb_binary_images} = 1; 

내가이 플래그를 설정 한 후에는 이미지가 올바른 형식으로 반환됩니다. 그것은 가치가 무엇인지에 대한

$dbh->{LongTruncOK} = 0; 
$dbh->do("set textsize 1000000"); 
관련 문제