2013-10-29 36 views
2

我正在使用Java JDBC連接到MySQL數據庫並將數據加載到表中。 Load in data語句在從GUI界面(我正在使用Navicat)運行時工作正常。但是,當我採取相同的語句,並將其放置在一個文本文件,然後我讀使用下面的代碼不起作用:Java JDBC問題,第1行不包含所有列的數據

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中是否存在禁用嚴格模式的設置?還是我想念的東西?

+0

是什麼'loadinhcc [I]'包含哪些內容? – Kal

+0

其聲明中的加載不會在程序上工作,但在我從navicat運行時運行正常。實際查詢是: LOAD DATA INFILE'/path/test.txt'INTO TABLE hcc FIELDS TERMINATED BY'|' ''''ESCAPED BY''LINES終止'\ n'忽略1行; –

+0

您不能使用'sqlldr'命令通過JDBC加載數據,您必須使用SQL ..'insert into table(col1 ,col2,...)values(val1,val2 ..);' – Kal

回答

1

當通過JDBC連接啓動會話時,MySQL設置爲嚴格。我在命令行和GUI上測試了我的查詢,並且兩次查詢都能正常工作。只有在通過JDBC運行查詢時,我纔得到一個錯誤。據蒂莫西MySQL的錯誤論壇:

可能的解決方法是關閉嚴格模式,無論是對整個 服務器,特定會話,或者只是幾個語句。例如: 示例:

set @old_sql_mode = @@ sql_mode; set 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 Documentation

相關問題