escape-символ для '@' - JDBC?

0

Я делаю пакетную вставку в таблицу MySQL:

insert into table1 (field1, field2) values("[email protected]", "f2 value"), ("[email protected]", "another f2 here");

давая ошибку символу '@' в значении String:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с значениями "вставить в покупателя" (поле1, поле2) ("aa @" в строке 1 на sun.reflect.NativeConstructorAccessorImpl.newInstance0 (собственный метод) на солнце. отразить. NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) на sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.newInstance(Constructor.java:423) на com.mysql.jdbc.Util.handleNewInstance(Util.java:425) в com.mysql.jdbc.Util.getInstance(Util.java:408) в com.mysql.jdbc.SQLError.createSQLException(SQLError.java:943) на com.mysql. jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3970) в com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3906) в com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2524) на com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2677) в com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2549) на com.mysql.jdbc.Prepar edStatement.executeInternal(PreparedStatement.java:1861) в com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073) в com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009) на com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5098) в com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)

Как я могу обойти это - есть ли какой-то способ демонстрации JDBC для работы?

Примечание. Я знаю о выполнении JDBC-партии. Я ищу решение для вышеперечисленного - если таковые имеются:

pStat.addBatch();
pStat.executeBatch();

ТИА.

Дальнейшее примечание: вышеупомянутый запрос на ввод выполняется отлично непосредственно в MySQL без JDBC между ними. Также обратите внимание: это не проблема, когда сам JDBC устанавливает параметр с помощью pStat.getString("[email protected]"); - таким образом, пакетный execn является решением.

  • 0
    Ошибка в самой вставке? Вы пробовали скобки?
  • 0
    @DanielMarcus Пожалуйста, смотрите "Дальнейшее примечание". спасибо за комментарий.
Показать ещё 5 комментариев
Теги:
jdbc

5 ответов

1
Лучший ответ

Я не думаю, что сообщение об ошибке указывает на проблему с символом "@".

Синтаксическая ошибка MySQL "правильный синтаксис для использования рядом" обычно указывает на первый токен, где встречается проблема. В этом случае, похоже, что MySQL возражает против INSERT.

... рядом с значениями " insert into buyers (field1, field2) values ('aa@ " в строке 1 на

Я подозреваю, что есть что-то перед этой insert в текст SQL, а MySQL видит несколько операторов. Это просто предположение, мы не видим фактического кода.

Я рекомендую отображать фактическое содержимое текста SQL, прежде чем оно будет выполнено или подготовлено.

  • 0
    тогда почему он работает на SQL записках? Я печатаю запрос на консоль - копировать / вставлять в альбом для запуска.
  • 0
    кроме того, строка не заканчивается на «@».
Показать ещё 3 комментария
3

Попробуйте использовать PreparedStatement. Он автоматически разрешает специальные символы и исключает SQL-инъекцию.

String queryStr = "insert into table1 (field1, field2) values(?, ?);"
try {
    PreparedStatement preparedStatement = conn.prepareStatement(queryStr);
    preparedStatement.setString(1, "[email protected]");
    preparedStatement.setString(2, "f2 value");
    preparedStatement.executeUpdate();
} catch (SQLException e) {
    // Error
} finally {
    if (preparedStatement != null) {
        preparedStatement.close();
    }
    if (conn != null) {
        conn.close();
    }
}

Дополнительные примеры: https://www.mkyong.com/jdbc/jdbc-preparestatement-example-insert-a-record/

0

Делал два запроса, разделенных ; в одной. все разрешено. ничего плохого в @.

Спасибо за проницательные комментарии и ответы.

0

Используйте код UTF-8 для специальных символов при работе с Java. Код UTF-8 для @: \u0040:

insert into table1 (field1, field2) values("aa\u0040gmail.com", "f2 value"), ("cc\u0040gmail.com", "another f2 here");
0

Используйте одинарные кавычки:

insert into table1 (field1, field2) 
  values('[email protected]', 'f2 value'), ('[email protected]', 'another f2 here');
  • 1
    Для SQL лучше всего использовать одинарные кавычки вокруг строковых литералов, но MySQL допускает двойные кавычки вокруг строковых литералов, если ANSI_QUOTES не включен в sql_mode .

Ещё вопросы

Сообщество Overcoder
Наверх
Меню