у меня есть проблема с ошибкой синтаксиса SQL, мой запрос и код выглядит следующим образом:SQL Ошибка синтаксиса с зарезервированными словами (Java)
@Override
public void insert() {
try {
PreparedStatement stmt = Main.getSQL().getConnection().prepareStatement(
"INSERT INTO `" + Settings.mysqlPref + "guilds` (name, tag, owner, allies, points, kills, deaths, validity, " +
"attacked, home, members, pvp, born, lives, bossHealth) " +
"VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
stmt.setString(1, name);
stmt.setString(2, tag);
stmt.setString(3, ownerUniqueId.toString());
stmt.setString(4, Serializer.serializeList(allies));
stmt.setInt(5, getPoints());
stmt.setInt(6, kills);
stmt.setInt(7, deaths);
stmt.setLong(8, validity);
stmt.setLong(9, protection);
stmt.setString(10, Serializer.serializeLocation(home));
stmt.setString(11, Serializer.serializeList(members));
stmt.setBoolean(12, pvp);
stmt.setLong(13, born);
stmt.setInt(14, lives);
stmt.setInt(15, bossHealth);
stmt.executeUpdate();
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
Вот трассировки стека:
com.mysql.jdbc.exceptions.jdbc4.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 ''name', 'tag', 'owner', 'allies', 'points', 'kills', 'deaths', 'validity', 'atta' at line 1
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:407)
at com.mysql.jdbc.Util.getInstance(Util.java:382)
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1052)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2111)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2407)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2325)
at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2310)
at me.khalit.prostorm.tools.data.Guild.insert(Guild.java:126)
at me.khalit.prostorm.tools.util.thread.Work.execute(Work.java:71)
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftTask.run(CraftTask.java:71)
at org.bukkit.craftbukkit.v1_7_R4.scheduler.CraftAsyncTask.run(CraftAsyncTask.java:53)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Проблема - для меня это работает правильно, но для моего клиента (как вы видите выше) это не так. Я не знаю, в чем проблема, потому что для меня все работает правильно. На SQLite или MySQL нет никакой разницы.
Я видел, что это проблема с зарезервированными словами в MySQL, но я сделал 'guilds'
, и он должен работать правильно. К сожалению, это не для моего клиента.
Я просто сдался, может быть, у вас, ребята, есть некоторые решения? Я не знаю, какие фрагменты кода вам нужны, поэтому скажите мне, требуется ли что-либо.
'' 'name'' выглядит подозрительно для меня. Может быть, что-то лишнее? – talex
Что такое 'Settings.mysqlPref'? –
Я настоятельно рекомендую вам использовать SQL-Query Builder, например Jooq/Speedment. Обычный SQL в приложении Java - это головная боль .. –