查询在服务器上运行时查询时出现MySQL语法错误,但在工作台中运行时却没有

时间:2017-09-08 10:55:10

标签: mysql

我有一个像这样的MySQL查询:

truncate table A;load data local infile '~/some.csv' into table A fields terminated by ',' OPTIONALLY ENCLOSED BY '\"' (COLUMN1,COLUMN2,COLUMN3)

当我在工作台中运行它但是当它由java app执行时,它运行得很好:

String qry = "truncate table A;load data local infile '~/some.csv' into table A fields terminated by ',' OPTIONALLY ENCLOSED BY '\"' (COLUMN1,COLUMN2,COLUMN3)";
Connection con = DriverManager.getConnection(HOST, USER, PASSWORD);
java.sql.Statement stmt = con.createStatement();
stmt.execute(qry);

我明白了:

  

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以便在第1行的表A'中使用'load data local infile'〜/ some.csv'附近使用正确的语法

服务器上的版本是:MySQL 5.6.27

在我的本地计算机上它是:5.7.19,对于Linux(x86_64)

PS:我在workbench中运行的查询是我登录java应用程序的查询。

1 个答案:

答案 0 :(得分:2)

正如现在删除的评论中所提到的,您的问题可能是尝试执行多个MySQL语句,而MySQL处于禁止多个语句的模式。一种解决方法是将连接URL更改为以下内容:

String dbUrl = "jdbc:mysql://localhost:3306/yourDB?allowMultiQueries=true";  

以下是一段代码片段,展示了如何执行此操作:

public static void main (String[] args) {
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        String HOST = "jdbc:mysql://localhost:3306/yourDB?allowMultiQueries=true";
        String qry = "truncate table A;load data local infile '~/some.csv' into table A fields terminated by ',' OPTIONALLY ENCLOSED BY '\"' (COLUMN1,COLUMN2,COLUMN3)";
        Connection con = DriverManager.getConnection(HOST, USER, PASSWORD);
        java.sql.Statement stmt = con.createStatement();
        stmt.execute(qry);
}
catch (Exception e) {
    System.out.println("failed");
    e.printStackTrace(System.out);
}

这可能是最快的解决方法。如果没有,那么您可以考虑使用批处理,或者只是为截断和加载数据执行多个语句。基于@GaborSch下面的评论,执行单独的陈述可​​能是更安全的选择。

进一步阅读:

Multiple queries executed in java in single statement