【问题标题】:Creating a table in mysql with java named by the user?用用户命名的java在mysql中创建一个表?
【发布时间】:2017-10-22 03:16:52
【问题描述】:

问题是,有没有办法从文本字段中创建一个由用户命名的新表。我知道它是一个巨大的注入端口,但我真的需要新表,它只能离线工作。我试过了

String newtable = jTextField1.getText();
PreparedStatement create = conn.prepareStatement("CREATE TABLE IF NOT EXISTS '"+newtable+"'(ID INTEGER NOT NULL AUTO_INCREMENT, IDapol INTEGER, ΗΜΕΡΟΜΗΝΙΑ DATE, ΕΣΟΔΑ DOUBLE, PRIMARY KEY(ID), CONSTRAINT IDapol FOREIGN KEY(IDapol) REFERENCES apol(IDapol)");    

但我收到一条错误消息:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在“1718”附近使用正确的语法(ID INTEGER NOT NULL AUTO_INCREMENT,IDapol,INTEGER,ΗΜΕΡΟΜΗΝΙΑ' 在第 1 行

1718 是我的 textField1 的值。 我可以使用任何帮助吗?谢谢

【问题讨论】:

  • 表名应以字符开头
  • 据我所知mysql不允许只有数字的表名。正如documentation 所说:标识符可以以数字开头,但除非被引用,否则可能不仅仅由数字组成。
  • 打印您生成的查询并尝试在数据库中运行。这是语法错误,您可以自己解决。

标签: java mysql mysql-error-1064 create-table


【解决方案1】:

根据此处:https://dev.mysql.com/doc/refman/5.7/en/identifiers.html,“标识符可以以数字开头,但除非被引用,否则可能不完全由数字组成。”

此外,目前您的代码很容易受到 SQL 注入攻击。

【讨论】:

  • 你说得对,我现在输入了 ko 作为 textField 的值,并且 sql 回来时在第 1 行出现“...语法错误”
  • 删除'"+newtable+"' 中的撇号应该可以做到。如果没有,请发布完整的消息。
  • 它是:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 " 附近使用正确的语法。就是这样..
  • 实际的 SQL 语句是什么?
  • 我会将 SQL 语句减少到最低限度(例如CREATE TABLE IF NOT EXISTS '"+newtable+"'(ID INTEGER NOT NULL AUTO_INCREMENT, IDapol INTEGER),然后将其余部分一一添加,直到它中断。然后你就会知道是什么破坏了它。
【解决方案2】:

表名从不在' 中。要么使用反引号 (`),要么什么都不用:

"CREATE TABLE IF NOT EXISTS " + newtable + " (...)

您的表格名称也应该以字符开头!

【讨论】:

  • 你说得对,我现在输入 ko 作为 textField 的值,sql 在第 1 行返回“...语法错误” 我什么都没用,只是“+newtable+”(. ..
【解决方案3】:

如果不存在则创建表1718 (ID INTEGER NOT NULL AUTO_INCREMENT, IDapol 整数, ΗΜΕΡΟΜΗΝΙΑ日期, ΕΣΟΔΑ 双倍, 主键(ID), 约束IDapol 外键(IDapol) 引用 apol(IDapol);

在``代码中给出表名

【讨论】:

    猜你喜欢
    • 2013-07-08
    • 2011-08-24
    • 1970-01-01
    • 2015-12-07
    • 2022-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多