escape-символ для '@' - JDBC? - PullRequest
0 голосов
/ 25 мая 2018

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

insert into table1 (field1, field2) values("aa@gmail.com", "f2 value"), ("cc@gmail.com", "another f2 here");

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

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: у вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования значений 'вставка в покупателей (field1, field2) (' aa @ 'в строке 1 на sun.reflect.NativeConstructorAccessorImpl.newInstance0 (Native Method) на солнце.refle.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:62) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lanst.reflect.Conjj..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.jysqlqljlqljlqljmqjjmqqmjjq: Mysql: Mysq.jdbc.MysqlIO.sqlQueryDirect (MysqlIO.java:2677) на com.mysql.jdbc.ConnectionImpl.execSQL (ConnectionImpl.java:2549) на com.mysql.jdbc.PreparedStatement.executeInternal (PreparedStatement.java:1861) по адресу com.mysql.jdbc.PreparedStatement.executeUpdateInternal (PreparedStatement.java:2073) по адресу com.mysql.jdbc.PreparedStatement.executeUpdateInjj.jjjjjjjjjjjp ().PreparedStatement.executeLargeUpdate (PreparedStatement.java:5098) в com.mysql.jdbc.PreparedStatement.executeUpdate (PreparedStatement.java:1994)

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

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

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

TIA.

Примечание: Приведенный выше запрос на вставку прекрасно работает непосредственно на MySQL без промежуточного JDBC.Также обратите внимание: это не проблема, когда JDBC сам устанавливает параметр с помощью pStat.getString("aa@gmail.com"); - таким образом, пакетное выполнение является решением.

Ответы [ 5 ]

0 голосов
/ 26 мая 2018

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

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

0 голосов
/ 26 мая 2018

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

insert into table1 (field1, field2) values("aa\u0040gmail.com", "f2 value"), ("cc\u0040gmail.com", "another f2 here");
0 голосов
/ 25 мая 2018

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

insert into table1 (field1, field2) 
  values('aa@gmail.com', 'f2 value'), ('cc@gmail.com', 'another f2 here');
0 голосов
/ 25 мая 2018

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

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

... около '1009 *' в строке 1 в

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

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

0 голосов
/ 25 мая 2018

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

String queryStr = "insert into table1 (field1, field2) values(?, ?);"
try {
    PreparedStatement preparedStatement = conn.prepareStatement(queryStr);
    preparedStatement.setString(1, "aa@gmail.com");
    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/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...