2016-12-30 2 views
0

나는 펄을 사용하여 MySQL의 데이터베이스에 이진 파일 (JPG 이미지)를 삽입을 시도하고"index"라는 열이있는 테이블에 값을 삽입하려고 할 때 SQL 구문 오류가 발생하는 이유는 무엇입니까?

테이블 :

CREATE TABLE `images` (
    `sku` CHAR(12) NOT NULL, 
    `index` TINYINT(1) UNSIGNED NOT NULL, 
    `main` BLOB NULL 
) 
COLLATE='utf8_general_ci' 
ENGINE=InnoDB 
ROW_FORMAT=DYNAMIC 
; 

펄 :

$dbh_local = DBI->connect("DBI:mysql:database=db;host=127.0.0.1;mysql_enable_utf8=1", "XXX", "XXX", {'RaiseError' => 1, 'mysql_auto_reconnect' => 1}); 

open IMAGE, "c:/image.jpg" or die $!; 
    while(read IMAGE, $buff, 1024) { 
     $image .= $buff; 
    } 
close(IMAGE); 

my $sku = 'VM1000032999'; 
my $index = 1; 

$query = "INSERT INTO images (sku,index,main) values (?,?,?)"; 
$sth = $dbh_local->prepare($query); 
$sth->bind_param(1,$sku); 
$sth->bind_param(2,$index); 
$sth->bind_param(3,$image, DBI::SQL_BLOB); 
$sth->execute();   
$sth->finish(); 

그러나 나는이 무엇입니까 오류 :

"DBD::mysql::st execute failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'index,main) values ('VM1000032999','1','????\0►JFIF\0☺☺☺\0H\0H\0\0??\0?\0♠♦♣♠♣♦♠' at line 1 at ...." 

아이디어가 있으십니까? 여러 가지 변형을 시도했는데 모두 동일한 오류가 발생했습니다.

+3

index는 예약어입니다. https://dev.mysql.com/doc/refman/5.5/en/keywords.html – user3606329

+1

예약어로 열 인덱스를 호출 할 수 없습니다. 그것은 create table에서 따옴표로 사용됩니다. 항상 인용하거나 더 나은 단어를 선택하십시오. – KeepCalmAndCarryOn

+1

'index'는 mysql 키워드입니다. 키워드를 필드 이름으로 사용하지 않는 것이 가장 좋습니다. 그렇다면 create table 문에서와 같이 키워드를 이스케이프 처리해야합니다. –

답변

5

귀하의 INSERT INTO- 문구에 예약어 index을 사용하고 있습니다. 예약어를 식별자로 사용하는 경우는 only permitted이고, 인용 부호는 Section 9.2, “Schema Object Names”입니다.

INSERT INTO 문에 index에서 `index`으로 변경하십시오.

테이블에 예약어를 사용하지 않는 것이 좋습니다.