2016-09-12 14 views
1

ローカルから.csvファイルをロードするときに問題があります。私のフィールドはVARCHAR(20)からINTに変更されました。LOAD DATA LOCAL INFILE後にMySQLフィールドがVARCHAR(20)からINTに変更されました

SELECT * FROM `len_enq_spph` WHERE po = '240000388'; 

その戻りヌル

をしかし、私はこの構文を使用する場合:私は、この構文を使用した後に(これは私が欲しいものである)ことを知っている私が欲しいもの

SELECT * FROM `len_enq_spph` WHERE po = 240000388; 

その戻りを。

poフィールドはVARCHAR(20)です。 しかし、なぜそのフィールドはwhere句のINTでなければなりませんか? 私のcsvファイル

id|order_id|ext_ord_ref|order_id2__1 
1|160000402|110005678|240000388 
2|160000402|110005678|240000388 
3|160000402|110005678|240000388 

のこの例と、これは私のLOADの構文は次のとおりです。

LOAD DATA LOCAL INFILE 'c:\\temp\\SPPH.csv' INTO TABLE len_enq_spph 
FIELDS TERMINATED BY '|' LINES TERMINATED BY '\n' IGNORE 1 LINES; 

私は、特定の分野にしようとしたが、まだ動作していません。

+0

号には、LOAD DATAは 'POの定義を変更されていません'列をVARCHAR(20)からINTに変換します。 1つのクエリで行が返されるのはなぜですか?なぜなら、行を返すクエリでは、数値リテラルとの比較を行うためにWHERE句の条件が暗黙的に 'po'を数値に変換しているからです。文字リテラル(一重引用符)では、変換は起こらず、 'po 'に格納された文字列が文字列リテラルと等しい場合にのみ条件が満たされます。 'po'カラムの値の最後に隠された '\ r''文字があると思います。 – spencer7593

答えて

1

MS-DOS形式のCSVファイルの場合、行終端文字には改行文字が含まれている可能性があります。ラインターミネータはおそらく'\r\n'です。

LINES TERMINATED BY '\n'を指定すると、'\r'文字が最後のフィールドに含まれています。

保存されているものとリテラルの違いを確認する方法の1つは、HEX機能を使用することです。このような何か:

SELECT HEX(q.po)   AS hex_po_col 
     , HEX('240000388') AS hex_literal 
    FROM len_enq_spph q 
    WHERE q.po = 240000388 

整数への比較は、MySQLが数値にpo列の暗黙的な変換を行っているので、行を一致させるために「働きます」。 MySQLは、文字列が有効な数字を形成しないようにする文字が出現するまで、文字を読むことによってそれを行います。

別のテストとして:

SELECT HEX(q.po)   AS hex_po_col 
    FROM len_enq_spph q 
    WHERE q.po = '240000388\r' 

それはカラムに充填異なる、または追加の「隠された」の文字だことも可能です。

SELECT HEX(q.po)   AS hex_po_col 
    FROM len_enq_spph q 
    WHERE q.po LIKE '240000388%' 

あなたは数値のみの有効な表現を保存したい場合は、中間ユーザ定義の変数にフィールドをロードするLOAD DATA文を変更し、ない表現でSET句を使用することができます数値に変換して、それをクリーンアップします。

私はcsvファイルの最初の行に基づいて、テーブル内の他の列名で推測している...

LOAD DATA LOCAL INFILE 'c:/temp/SPPH.csv' 
INTO TABLE len_enq_spph 
FIELDS TERMINATED BY '|' 
LINES TERMINATED BY '\r\n' 
IGNORE 1 LINES 
(`id` 
, `order_id` 
, `ext_ord_ref` 
, @order_id2_1 
) 
SET `po` = @order_id2_1 + 0 
+0

ありがとう、あなたは人生を救う。'\ r \ n'が問題です。 –

+0

これが質問された質問に答えた場合は、この回答を「受け入れる」ことを検討してください。 – spencer7593

関連する問題