2009-08-24 35 views
5

Sau đây là đoạn code tôi đã sử dụng:Không thể chèn byte [] vào MySQL sử dụng 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(); 

Và sau đây là một lỗi tôi nhận:

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 

Tôi có MySQL 5.0.41 và mysql-connector-java-5.1.7-bin.jar làm thư viện JDBC. Có ai có thể giúp tôi ở đây không? Cảm ơn bạn trước!

+2

gì datatype là 'chìa khóa'? –

+0

Bạn có thể thực hiện "mô tả " trên bàn của mình và hiển thị cho chúng tôi đầu ra để chúng tôi biết bạn đang xử lý loại cột nào không? –

Trả lời

0

Hãy thử sử dụng "setBinaryStream()" thay vì "setBytes()" và chuyển nó một ByteArrayInputStream được xây dựng trên mảng byte của bạn. Điều này, tất nhiên, giả định rằng kiểu dữ liệu được gán cho cột có thể lưu trữ các byte ... Hãy chắc chắn rằng nó là một BLOB, BINARY hoặc VARBINARY.

Ngoài ra, hãy sử dụng các dấu gạch chéo để bao quanh đối tượng của bạn. "key" là một từ khóa SQL, và khác hơn là nó chỉ là một thói quen tốt:

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

cũng đã thử điều đó, nhưng lỗi tương tự –

+1

Cập nhật với một đề xuất khác. – Jonathan

-2

Bạn nên thêm một luồng nhị phân. Bạn có quyền truy cập vào inputstream không ?? như thế này ..

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()' không ** không ** trả về độ dài. – BalusC

10

Vấn đề là cột của bạn được gọi là "khóa" là từ dự trữ trong SQL. Bao quanh nó với backticks và mọi thứ sẽ làm việc. Tốt hơn, hãy xem xét đổi tên cột thành một thứ không phải là từ dự trữ SQL. Tôi đã được chứng minh này ra bằng cách sử dụng mã bên dưới:

MySQL bảng:

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

mã 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 :)"); 
    } 
} 
Các vấn đề liên quan