2009-08-24 9 views
5

Poniżej znajduje się kod użyłem:Nie można wstawić byte [] do MySQL przy użyciu języka Java

byte[] bkey = key.getEncoded(); 
String query = "INSERT INTO keytable (name, key) VALUES (?,?)"; 
PreparedStatement pstmt = (PreparedStatement) connection.prepareStatement(query); 
pstmt.setString(1, "test"); 
pstmt.setBytes(2, bkey); 
pstmt.execute(); 

I następuje błąd uzyskałem:

com.mysql.jdbc.exceptions.MySQLSyntaxErrorException: 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 'key) VALUES ('test',_binary'?ʾ??s??u\'?}p?u')' at line 1 

mam MySQL 5.0.41 i mysql-connector-java-5.1.7-bin.jar jako biblioteka JDBC. Czy ktoś może mi w tym pomóc? Z góry dziękuję!

+2

jaki typ danych jest 'klucz'? –

+0

Czy możesz "opisać " na swoim stole i pokazać nam dane wyjściowe, abyśmy wiedzieli, z którymi typami kolumn masz do czynienia? –

Odpowiedz

0

Spróbuj użyć "setBinaryStream()" zamiast "setBytes()" i przekaż mu wartość ByteArrayInputStream zbudowaną na macierzy bajtów. Zakłada to oczywiście, że typ danych przypisany do kolumny może przechowywać bajty ... Upewnij się, że jest to BLOB, BINARY lub VARBINARY.

Użyj również przycisków wstecz, aby zamknąć obiekty. "klucz" to słowo kluczowe SQL, a poza tym to tylko dobry zwyczaj:

String query = "INSERT INTO `keytable` (`name`, `key`) VALUES (?,?)"; 
+0

już próbował tego, ale ten sam błąd –

+1

Zaktualizowano z inną sugestią. – Jonathan

-2

Powinieneś dodać strumień binarny. Czy masz dostęp do wejścia? w ten sposób ..

FileInputStream input = new FileInputStream("myfile.gif"); 
String query = "INSERT INTO `keytable` (`name`, `key`) VALUES (?,?)"; 
PreparedStatement pstmt = (PreparedStatement) connection.prepareStatement(query); 
pstmt.setString(1, "test"); 
pstmt.setBinaryStream(2, input, input.available()); 
+0

'input.available()' does ** not ** zwraca długość. – BalusC

10

Problem polega na tym, że kolumna "klucz" jest słowem rezerwowym w SQL. Otoczyć go odgłosami i rzeczy powinny działać. Co więcej, rozważ zmianę nazwy kolumny na coś, co nie jest słowem rezerwowym SQL. Mam sprawdzony to przy użyciu kodu poniżej:

MySQL tabeli:

create table keytable (name varchar(255) not null, `key` blob not null); 

kod Java:

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.PreparedStatement; 
import java.sql.SQLException; 

public class MySQLBlobInsert { 

    public static void main(String[] args) { 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     } catch (Exception e) { 
      throw new RuntimeException(e); 
     } 
     Connection conn = null; 
     try { 
      conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password"); 
      byte[] bkey = "This is some binary stuff".getBytes(); 
      String query = "INSERT INTO keytable (name, `key`) VALUES (?,?)"; 
      PreparedStatement pstmt = conn.prepareStatement(query); 
      pstmt.setString(1, "test"); 
      pstmt.setBytes(2, bkey); 
      pstmt.execute(); 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } finally { 
      if (conn != null) { 
       try { conn.close(); } catch (SQLException e) {} 
      } 
     } 
     System.out.println("done :)"); 
    } 
} 
Powiązane problemy