我正在使用Java JDBC连接到MySQL数据库并将数据加载到表中。从GUI界面运行时,Load in data语句正常工作(我正在使用Navicat)。但是当我使用相同的语句并将其放在一个文本文件中然后我使用以下代码阅读时,它不起作用:
public String readFile(String path, Charset encoding) throws IOException {
byte[] encoded = Files.readAllBytes(Paths.get(path));
return encoding.decode(ByteBuffer.wrap(encoded)).toString();
}
String hcccontent = readFile("resources/loadinhcc.txt", StandardCharsets.UTF_8);
String[] loadinhcc = hcccontent.split(regex);
for(int i = 0; i < loadinhcc.length; i++){
Statement stmt = conn.createStatement();
stmt.execute(loadinhcc[i]);
}
这样可以正常工作,因为我甚至通过代码提取了我的Java程序解析的查询,将其复制到navicat并且它加载了所有数据。当我运行它并让程序尝试执行时,我收到以下错误&#34;第1行不包含所有列的数据&#34;
我在网上搜索过,我看到的最接近可能导致此问题的是MySQL严格模式。如果输入的长度超过表中指定的值,MySQL不会加载,或者如果所有列都没有数据,则不会加载。但是,由于查询在Navicat中有效,因此确实会导致此问题,这没有任何意义。 JDBC中是否有设置禁用严格模式?或者是我缺少的其他东西?
答案 0 :(得分:2)
通过JDBC连接启动会话时,MySQL设置为strict。我在命令行和GUI上测试了我的查询,并且两次查询都有效。只有在通过JDBC运行查询时才会出现错误。根据Timothy的MySQL bug论坛:
可能的解决方法是关闭整个模式 服务器,特定会话或几个语句。对于 例如:
设置@old_sql_mode = @@ sql_mode; set sql_mode ='';
- 运行一些可能导致数据截断的语句设置为sql_mode = @old_sql_mode;
我在运行任何查询之前执行了set sql_mode= ''
,并且错误已停止。
stmt.execute("SET sql_mode = ''");
for (int i = 0; i < loadinhcc.length; i++) {
stmt.execute(loadinhcc[i]);
}
其他信息