2013-06-20 67 views
0

我使用的是.csv文件中的php和mysql LOAD DATA INFILE
一些細胞含有'€'符號和編號和一些一'$'符號和編號,如:2.13€,$ 5.4
當我CSV文件加載到表,與'$'標誌的細胞被正確地插入並且'€'的單元格爲EMPTY。
的相關列被定義爲如下:mysql LOAD DATA INFILE失敗,輸入歐元符號'€'

VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci 

我怎樣才能確保'€'標誌將被正確插入?

+2

什麼是文件的編碼? – bouscher

+0

剛纔看到文件的編碼是ANSI。 –

+0

如果你發現ANSI代表你的情況(它不是真正的編碼),你可以使用'set names XXXX'並讓MySQL進行轉換。但恕我直言,只需保存一份UTF-8的副本更爲簡單。 –

回答

4

我轉換的文件編碼:

$data = file_get_contents(PATH_TO_CSV_FILE); 
$data = mb_convert_encoding($data, 'UTF-8', 'Windows-1252'); 
file_put_contents(PATH_TO_MODIFIED_CSV_FILE, $data); 

然後它裝載到表:

LOAD DATA INFILE '".PATH_TO_MODIFIED_CSV_FILE."' INTO TABLE ... 
+1

自己是主人。你能接受你自己的答案嗎?所以其他人知道這個問題解決了。 –

2

嘗試:

LOAD DATA INFILE '".PATH_TO_CSV_FILE."' INTO TABLE tbl_name CHARACTER SET latin1 

LATIN1對應到Windows 1252和CP- 1252。

0

我結束了使用下面的代碼來檢測和轉換,如果必要的:

<?php 
# Detect and convert to utf-8 
$data = file_get_contents($file_full_path); 
if(mb_detect_encoding($str,"UTF-8, ISO-8859-1, Windows-1252") != "UTF-8") { 
    $data = mb_convert_encoding($data, 'UTF-8', 'Windows-1252'); 
    file_put_contents($file_full_path, $data); 
} 

但是,如果你知道文件的字符集,你加載你應該definetly使用MySQL命令去,因爲它在the documentation狀態:

由character_set_database系統 變量表示的字符集是用來解釋文件中的信息。 SET NAMES 和character_set_client的設置不會影響輸入的解釋 。如果輸入文件的內容使用 與默認值不同的字符集,則通常最好使用CHARACTER SET子句指定文件的 字符集,該子句從MySQL 5.1.17開始可用,其中 可用。字符集二進制的規定「沒有 轉換。」

用下面sintax:

LOAD DATA INFILE 'file_name' INTO TABLE tbl_name [CHARACTER SET charset_name]