2016-09-12 72 views
1

從本地加載.csv文件時出現問題。我的領域已經從VARCHAR(20)變爲INT了。我知道後,使用該語法(這就是我想要的):加載數據本地INFILE後,MySQL字段從VARCHAR(20)更改爲INT

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

其返回空

但是,如果我用這個語法:

SELECT * FROM `len_enq_spph` WHERE po = 240000388; 

其回報就是我想要的。

po字段是VARCHAR(20)。 但是爲什麼該字段必須在哪裏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的列。爲什麼一個查詢返回行,另一個不是?這是因爲在返回行的查詢中,WHERE子句中的條件導致將'po'隱式轉換爲數字,以便與數字文字進行比較。使用字符字面值(單引號)不會發生轉換,只有在存儲在「po」中的字符串與字符串字面值相等時纔會滿足條件。我敢打賭,你在'po'列值的末尾有一個隱藏的''\ r'字符。 – spencer7593

回答

1

如果這是一個MS-DOS格式的csv文件,該行終止可能包括一個回車符。行結束符可能是'\r\n'

當您指定LINES TERMINATED BY '\n',該'\r'字符被包含在最後一個字段。

的一種方法,看看什麼之間存儲的差別,而文字是用十六進制的功能。事情是這樣的:

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

相關問題