2016-12-30 4 views
0

私はperlの"index"という名前の列を持つテーブルに値を挿入しようとすると、SQL構文エラーが発生するのはなぜですか?

表使用のMySQLデータベースにバイナリ・ファイル(JPGイメージ)を挿入しようとしています:私はこれを取得していますが

$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(); 

を:Perlは

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 
; 

をエラー:

"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`に変更してください。

テーブルに予約語を使用することはお勧めしません。

関連する問題