SQL适用于PMA,但不适用于Java

时间:2015-02-17 02:45:47

标签: java mysql

我有一个准备好的声明:

CREATE TABLE IF NOT EXISTS ? (uuid VARCHAR(128), item VARCHAR(48), value FLOAT, UNIQUE (uuid))

如果我直接在PMA中执行此操作,但更换了?使用任何文本文本,它完美地工作,它正确地创建表。但是,如果我从Java运行它就不起作用。

  

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的SQL语法中有错误;查看与MySQL服务器版本对应的手册,以便在''Murder_PlayerData'附近使用正确的语法(uuid VARCHAR(128),item VARCHAR(48),value FLOAT,UNIQUE(u'在第1行

这是Java代码

    String table = "Murder_PlayerData";
    String execute = "CREATE TABLE IF NOT EXISTS ? (uuid VARCHAR(128), item VARCHAR(48), value FLOAT(11), UNIQUE (uuid))"; 

    PreparedStatement statement = sql.getConnection().prepareStatement(execute);
    statement.setString(1, table);
    statement.execute();

为什么它在PMA中起作用,但在我从Java中起作用时却不起作用?

1 个答案:

答案 0 :(得分:1)

准备语句不能用于来定义表名,而是定义与列相关的值(插入值,wherehaving条件的值,等等) 。理解它的一种方法是:准备语句用于DML操作,而不用于DDL操作。

如果要在运行时构建表,则需要“手动”构建SQL语句:

String table = "Murder_PlayerData"
String strSQL = "create table if not exists " + table + "("
                 // Add your column definitions
              + ")"
Statement stmt = conn.createStatement();
stmt.execute(strSQL);

请注意,如果变量table可以填充用户提供的数据,那么您的代码将容易受到SQL Injection Attacks的攻击。我建议你不要创建表,如果他们的名字必须由用户提供,而是在没有任何用户交互的情况下创建表,然后插入值,使用某种键来识别属于哪些记录每个用户。