Я делаю пакетную вставку в таблицу 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 является решением.
Я не думаю, что сообщение об ошибке указывает на проблему с символом "@".
Синтаксическая ошибка MySQL "правильный синтаксис для использования рядом" обычно указывает на первый токен, где встречается проблема. В этом случае, похоже, что MySQL возражает против INSERT
.
... рядом с значениями "
insert into buyers (field1, field2) values ('aa@
" в строке 1 на
Я подозреваю, что есть что-то перед этой insert
в текст SQL, а MySQL видит несколько операторов. Это просто предположение, мы не видим фактического кода.
Я рекомендую отображать фактическое содержимое текста SQL, прежде чем оно будет выполнено или подготовлено.
Попробуйте использовать 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/
Делал два запроса, разделенных ;
в одной. все разрешено. ничего плохого в @
.
Спасибо за проницательные комментарии и ответы.
Используйте код UTF-8 для специальных символов при работе с Java. Код UTF-8 для @
: \u0040
:
insert into table1 (field1, field2) values("aa\u0040gmail.com", "f2 value"), ("cc\u0040gmail.com", "another f2 here");
Используйте одинарные кавычки:
insert into table1 (field1, field2)
values('[email protected]', 'f2 value'), ('[email protected]', 'another f2 here');
ANSI_QUOTES
не включен в sql_mode
.