我对mysql比较陌生,我正在尝试制作discord bot来保存discord用户的id和mysql数据库的密钥。当bot启动时,它加载mysql并连接到数据库,然后尝试创建一个不存在的表,使用以下方法:
try {
PreparedStatement ps = this.connection.prepareStatement("create table if not exists keys (discord bigint(250), key bigint(250));");
ps.execute();
} catch (SQLException ex) {
ex.printStackTrace();
}
当我尝试运行它时,出现以下错误:
java.sql.SQLSyntaxErrorException: 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 'bigint(250))' at line 1
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:118)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:95)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:960)
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:388)
at main.java.bot.discord.utils.MySQL.update(MySQL.java:86)
at main.java.bot.discord.utils.MySQL.init(MySQL.java:28)
at main.java.bot.discord.utils.MySQL.<init>(MySQL.java:20)
at main.java.bot.discord.Main.boot(Main.java:61)
at main.java.bot.discord.Main.run(Main.java:56)
at main.java.bot.discord.Main.main(Main.java:32)
要连接到我正在使用的数据库:
Class.forName("com.mysql.cj.jdbc.Driver");
this.connection = DriverManager.getConnection("jdbc:mysql://" + this.host + ":" + this.port + "/" + this.database + "?useSSL=false serverTimezone=America/New_York", this.username, this.password);
我使用的mysql驱动程序是mysql connector v8.0.11,就像我说的,我是mysql新手,所以我可能做了一些完全错误的事情。如果我是,请告诉我。谢谢。
edit:mysql类中的第86行是我执行preparedstatement的地方。
5条答案
按热度按时间gj3fmq9x1#
如前几次答复所述,关键字和键都是保留字。在没有特殊处理的情况下,不能在表名或列名中使用它们。但是,以前的答复指出,可以通过将这些值注解为[keys]/[key]或“keys”/“key”来使用这些值。这是不正确的。
在mysql中,backtick用于创建一个文本值,然后可以用于表或列名。看起来是这样的:
然而,即使从技术上讲,当您将保留字封装在backticks中时可以使用保留字,但这是非常糟糕的做法。请不要这样做。绝大多数sql语句都是在没有反勾号的情况下编写的。如果您创建表的方式使一个或多个列需要反勾号,那么这往往会导致许多sql错误。
d5vmydt92#
根据mysql文档,不能对表名、列名或任何其他标识符使用保留字。你用的是什么
keys
作为表名&key
作为列名,两者都是保留字。我还注意到你在用
;
定界符,请记住,在大多数数据库的查询中,这不能通过jdbc驱动程序工作,因为它通常不是语句语法本身的一部分,而是命令行或脚本输入到单独语句的终止符。ctehm74n3#
如果需要使用key作为名称,可以这样做
[key]
或者"Key"
,正如其他人提到的,它是保留字之一。gpnt7bae4#
key
是保留字,请将列名更改为其他名称。7tofc5zh5#
我认为250到bigint的值太大了。尽量不要使用这个或设置为较小的值。请记住,此值仅通知显示宽度(在您的情况下为250个字符),而不通知最大值或使用的字节。
对于保留字,我总是用字符来转义