[解決済み] MySQLがCSVデータからNULL値を読み込む
2022-04-21 22:51:18
質問
カンマで区切られた3列から4列の数値を含むファイルを持っています。空のフィールドは、行の最後にある場合を除き、定義されています。
1,2,3,4,5
1,2,3,,5
1,2,3
MySQLで以下のようなテーブルが作成されました。
+-------+--------+------+-----+---------+-------+ | フィールド|タイプ|Null|キー|デフォルト|エクストラ|||。 +-------+--------+------+-----+---------+-------+ | 1|int(1)|YES|NULL|||||||。 | 2|int(1)|YES||NULL||||。 | 3|int(1)|YES|NULL||||||||。 | 4|int(1)|YES||NULL||||。 | ファイブ|int(1)|YES|NULL|||||||||。 +-------+--------+------+-----+---------+-------+
MySQLのLOADコマンドを使用してデータをロードしようとしています。
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
出来上がったテーブル。
+------+------+-------+------+------+ | 一|二|三|四|五|の順。 +------+------+-------+------+------+ | 1 | 2 | 3 | 4 | 5 | | 1|2|3|ヌル|ヌル|ヌル +------+------+-------+------+------+
問題は、生データでフィールドが空で定義されていない場合、MySQL は何らかの理由でカラムのデフォルト値(NULL)を使用せず、ゼロを使用するという事実にあります。フィールドがまったくない場合は、NULL が正しく使用されます。
残念ながら、現段階ではNULLと0を区別できるようにしなければならないので、何か手助けがあればありがたいのですが。
ありがとうございます。 S.
編集
SHOW WARNINGSの出力です。
+---------+------+--------------------------------------------------------+ | レベル|コード|メッセージ +---------+------+--------------------------------------------------------+ | 警告|1366|行2の列'4'の整数値が不正確です。 | 警告|1261|第3行はすべての列のデータを含んでいません|。 | 警告|1261|3行目はすべての列のデータを含んでいません。 +---------+------+--------------------------------------------------------+
解決方法は?
これはあなたが望むことを実行します。4番目のフィールドをローカル変数に読み込み、ローカル変数が空文字列を含むことになる場合、実際のフィールドの値をNULLに設定します。
LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(one, two, three, @vfour, five)
SET four = NULLIF(@vfour,'')
;
もし、全部が空の可能性があるなら、全部を変数に読み込んで、こんな風に複数のSET文がある。
LOAD DATA INFILE '/tmp/testdata.txt'
INTO TABLE moo
FIELDS TERMINATED BY ","
LINES TERMINATED BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = NULLIF(@vone,''),
two = NULLIF(@vtwo,''),
three = NULLIF(@vthree,''),
four = NULLIF(@vfour,'')
;
関連
-
MySQLデータ型の詳細
-
MySQL XAが分散型トランザクションを実装する方法を1記事にまとめました。
-
[解決済み] datetimeの挿入時に文字列から日付や時刻を変換すると、変換に失敗する
-
[解決済み] MySQLでdatetimeとtimestampのどちらのデータ型を使用すべきですか?
-
[解決済み] MySQLのAUTO_INCREMENTをリセットする方法
-
[解決済み] MySQLのクエリ結果をCSV形式で出力するにはどうすればよいですか?
-
[解決済み] ブーリアン値を格納するために使用するMySQLデータ型
-
[解決済み] PostgreSQLからのPL/pgSQL出力をCSVファイルに保存する
-
[解決済み] MySQLで重複する値を検索する
-
[解決済み] CSVファイルをMySQLのテーブルにインポートするには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
mysqlにおけるvarcharの日付比較とソートの実装
-
MySQLインストールチュートリアル(Linux版
-
MySQLの一般的な分割ライブラリおよび分割テーブルスキームの概要
-
'INSERT文はFOREIGN KEY制約「FK_TourismReservation_Users」と競合していました。その
-
群関数解の無効な使用
-
msql クエリでのエラー 'where 節' の不明な列 'yellow fruit'
-
CMakeエラー。ソースディレクトリ "/xxx/mysql-5.6.21" に CMakeLists.txt がないようです。
-
[解決済み] mysqladminのフラッシュホストでブロックを解除する方法
-
[解決済み] なぜ SQLAlchemy の count() は生のクエリよりずっと遅いのでしょうか?
-
[解決済み】MySQLで--secure-file-privにどう対処すればいいのか?