2

Java JDBC を使用して MySQL データベースに接続し、データをテーブルにロードしています。Load in data ステートメントは、GUI インターフェイスから実行すると正常に機能します (私は 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にコピーし、すべてのデータをロードしたコードをステップ実行しても、これはうまく機能します。それを実行してプログラムを実行しようとすると、「行 1 にはすべての列のデータが含まれていません」というエラーが表示されます。

私はオンラインで検索しましたが、この問題を引き起こしている可能性のある最も近いものは、MySQL の厳格モードです。入力がテーブルで指定されているものよりも長い場合、MySQL はロードされません。または、すべての列のデータがない場合はロードされない可能性があります。しかし、クエリが Navicat で機能するため、これがこの問題を引き起こしているとは言えません。Strict モードを無効にする JDBC の設定はありますか? それとも、私が見逃しているものですか?

4

1 に答える 1

2

JDBC 接続を介してセッションが開始されると、MySQL は厳密に設定されます。コマンド ラインと GUI を使用してクエリをテストしましたが、どちらの場合もクエリは機能しました。エラーが返されたのは、JDBC を介してクエリを実行したときだけでした。MySQL バグ フォーラムの Timothy によると:

可能な回避策は、サーバー全体、特定のセッション、またはいくつかのステートメントに対して、厳密モードをオフにすることです。例えば:

@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 ドキュメント

于 2013-10-30T13:50:25.513 に答える