0

LOAD DATA INFILE を使用して MySQL テーブルにテスト データを入力していますが、理解できない動作が見られます。タイムスタンプ列 (デフォルト = CURRENT_TIMESTAMP) は、一部のレコードを正しく更新し、他のレコードは一見ランダムに 0000-00-00 00:00:00 で更新しています。

Questions Table Structure:
Column             Type     Null    Default             Comments
Q_ID               int(10)  No           
Clients_ID         int(10)  No           
Question           varchar(255) No  

. . 他のフィールドは省略されています。

Submit_Timestamp   timestamp    No      CURRENT_TIMESTAMP 

データベースに接続した後、関連するコード行は次のとおりです。

// prepare the SQL query for the Questions table

$sql = "LOAD DATA INFILE 'c:/wamp/www/Q_Sample_01.CSV' INTO TABLE Questions FIELDS TERMINATED BY ','";

// submit the query and capture the result

$result = mysqli_query($conn, $sql) or die (mysqli_error($conn));

プログラムが実行され、Submit_Timestamp フィールドを除いてすべてのフィールドにデータが正しく INSERT されます。ただし、Submit_Timestamp フィールドは正しい結果を取得する場合もあれば、0000-00-00 00:00:00 を取得する場合もあります。

CSV ファイルには、不足している Q_ID データを示すために、すべてのレコードの先頭にカンマがあります。Autoincrement である Q_ID フィールドは正しく機能しています。CSV 行の末尾にタイムスタンプのデータがありません。MySQL がデフォルト値を入力することを期待しています。Submit_Timestamp フィールドに追加するデータがあることがより明確になるかもしれないと考えて、CSV にリストされている最後のフィールドの後に末尾のカンマを挿入しようとしましたが、状況が悪化し、0000-00-00 00:00:00 が表示されました。すべての記録のために。

Submit_Timestamp ON UPDATE CURRENT_TIMESTAMP を作成するテーブルを変更する提案も試みましたが、役に立たず、このフィールドに必要な動作ではないため、削除しました。

パターンに気付きましたが、まだ説明がつきません。タイムスタンプがすべて 0 のレコードには、二重引用符で囲まれたフィールドが少なくとも 1 つ含まれており、含まれているカンマが新しいフィールドを不適切に示してしまうのを防ぎます。これは、常に最後のフィールド (Submit_Timestamp フィールドに隣接する) にあるとは限りません。CSV は Microsoft Excel で作成されました。

どこが間違っていますか?

4

1 に答える 1

1

カンマを含む文字列データでは、Excel の CSV への保存に問題があります。

これは、区切り文字をデータにないものに変更することで簡単に修正できます。「|」を使用しました (キーボードのバックスラッシュの上)。

また、SQL コマンドを変更して、この変更を区切り文字に組み込む必要があります。

$sql = "LOAD DATA INFILE 'c:/wamp/www/Q_Sample_01.CSV' INTO TABLE Questions FIELDS TERMINATED BY '|'";

これは完璧に機能しました。

于 2013-04-10T23:38:26.027 に答える