Не могу вставить byte [] в MySQL, используя Java - PullRequest
5 голосов
/ 25 августа 2009

Ниже приведен код, который я использовал:

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

И следующее сообщение об ошибке:

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

У меня MySQL 5.0.41 и mysql-connector-java-5.1.7-bin.jar в качестве библиотеки JDBC. Кто-нибудь может помочь мне здесь? Заранее спасибо!

Ответы [ 3 ]

10 голосов
/ 01 сентября 2009

Проблема в том, что ваш столбец с именем "ключ" является резервным словом в SQL. Окружите его галочками и все должно работать. Еще лучше рассмотреть вопрос о переименовании столбца во что-то, что не является резервным словом SQL. Я доказал это, используя код ниже:

Таблица MySQL:

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

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 :)");
    }
}
0 голосов
/ 25 августа 2009

Вы должны добавить двоичный поток. У вас есть доступ к входному потоку ?? как это ..

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 голосов
/ 25 августа 2009

Попробуйте использовать «setBinaryStream ()» вместо «setBytes ()» и передать ему ByteArrayInputStream, созданный на вашем байтовом массиве. Это, конечно, предполагает, что тип данных, назначенный столбцу, может хранить байты ... Убедитесь, что это BLOB, BINARY или VARBINARY.

Кроме того, используйте отступы, чтобы заключить ваши объекты. «ключ» - это ключевое слово SQL, а кроме этого это просто полезная привычка:

String query = "INSERT INTO `keytable` (`name`, `key`) VALUES (?,?)";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...