2

我正在使用 Java JDBC 连接到 MySQL 数据库并将数据加载到表中。从 GUI 界面(我使用的是 Navicat)运行时,Load in data 语句工作正常。但是当我采用相同的语句并将其放在一个文本文件中时它不起作用,然后我使用以下代码读取该文件:

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 并加载了所有数据。当我运行它并让程序尝试执行时,我收到以下错误“第 1 行不包含所有列的数据”

我在网上搜索过,我看到的最接近可能导致此问题的是 MySQL 严格模式。如果输入长于表中指定的长度,则 MySQL 不会加载,或者如果所有列都没有数据,则可能不会加载。但由于查询在 Navicat 中有效,这将导致此问题是没有意义的。JDBC中是否有禁用严格模式的设置?还是我缺少其他东西?

4

1 回答 1

2

当会话通过 JDBC 连接启动时,MySQL 设置为严格。我在命令行和 GUI 上测试了我的查询,两次查询都有效。只有在通过 JDBC 运行查询时,我才返回一个错误。根据 Timothy 在 MySQL 错误论坛上的说法:

一种可能的解决方法是为整个服务器、特定会话或仅几个语句关闭严格模式。例如:

设置@old_sql_mode = @@sql_mode; 设置 sql_mode = '';
-- 运行一些可能导致数据截断的语句 set 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]);
 }

附加信息

MySQL 文档

于 2013-10-30T13:50:25.513 回答