2009-08-24 12 views
5

siguiente es el código que he utilizado:No se puede insertar byte [] en MySQL utilizando 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(); 

Y que sigue es un error que tengo:

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 

tengo MySQL 5.0.41 y mysql-connector-java-5.1.7-bin.jar como biblioteca JDBC. ¿Alguien puede ayudarme aquí? ¡Gracias de antemano!

+2

lo que tipo de datos es 'clave'? –

+0

¿Puede hacer una "descripción " en su mesa y mostrarnos el resultado para que sepamos qué tipos de columnas está tratando? –

Respuesta

0

Pruebe usar "setBinaryStream()" en lugar de "setBytes()", y páselo ByteArrayInputStream construido en su matriz de bytes. Esto, por supuesto, asume que el tipo de datos asignado a la columna puede almacenar bytes ... Asegúrese de que sea un BLOB, BINARIO o VARBINARIO.

Además, use los apoyos para encerrar sus objetos. "Clave" es una palabra clave SQL, y aparte de que es sólo un buen hábito:

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

ya lo intenté también, pero el mismo error –

+1

Actualizado con otra sugerencia. – Jonathan

-2

Usted debe agregar un flujo binario. ¿Tiene acceso al inputtream? como este ..

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 ** devuelve la longitud. – BalusC

10

El problema es que su columna llamada "clave" es una palabra de reserva en SQL. Rodearlo con palos de atrás y las cosas deberían funcionar. Mejor aún, considere cambiar el nombre de la columna a algo que no sea una palabra de reserva de SQL. He demostrado esto con el siguiente código:

mesa

MySQL:

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

código 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 :)"); 
    } 
} 
Cuestiones relacionadas