2012-07-19 206 views
-1

我有一個問題。我有excel文件保存爲CSV,我需要用PHP讀取該文件,並插入到mysql中,但問題是與字符集專門čćšđž。我嘗試了utf8_encode()和幾乎所有我能想到的。閱讀.csv ANSI文件並寫入mysql

Examle:

它插入 「Petroviæ」,但它應該是 「彼得洛維奇」

編輯:

<?php 

mysql_connect("localhost", "user", "pw"); 
mysql_select_db("database"); 


$fajl = "Prodajna mreza.csv"; 
$handle = @fopen($fajl, "r"); 
if ($handle) { 
    $size = filesize($fajl); 

    if(!$size) { 
     echo "File is empty.\n"; 
     exit; 
    } 

    $csvcontent = fread($handle,$size); 
    $red = 1; 

    foreach(explode("\n",$csvcontent) as $line) { 
     if(strlen($line) <= 20) 
     { 
      $red++; 
      continue; 
     } 
     if($red == 1) 
     { 
      $red++; 
      continue; 
     } 
     $nesto = explode(",", $line); 

     if($nesto[0] == '') 
      continue; 

     mysql_query("INSERT INTO table(val1, val2, val3, val4, val5, val6, val7, val8) VALUES ('".$nesto[0]."','".$nesto[1]."','".$nesto[2]."','".$nesto[3]."','".$nesto[4]."','".$nesto[5]."','".$nesto[6]."','".$nesto[7]."')"); 

     $red++; 
    } 
    fclose($handle); 
} 
mysql_close(); 
?> 
+0

你現在的問題是什麼,編碼?你檢查了數據庫表格的整理和文件的編碼嗎? – 2012-07-19 13:28:14

+0

@DiegoAgulló嘗試更改排序規則,但沒有任何反應。 – 2012-07-19 13:31:58

+0

這裏有兩個方面:讀取文件並將其內容存儲在數據庫中。這兩者都可能對您造成問題。因此,爲了避免任何問題,您可能希望在PHP中生成一個固定值,例如作爲''Petrovi \ xc4 \ x87「'(假設一個UTF-8數據庫連接),看看你能否成功地存儲它。這應該有助於縮小範圍。根據是否有效,我們可能需要詳細瞭解您如何閱讀文件或者如何連接到數據庫。 – MvG 2012-07-20 10:54:42

回答

0

首先:使用這個mysql擴展名是discouraged。所以你可能想切換到別的東西。另請注意,通過簡單地粘貼字符串來組成查詢的方式會使其易受到SQL injection攻擊。如果您確實確信您閱讀的文件的內容中不會有任何難看的驚喜,那麼您只應該這樣做。

它表明您的文件讀取和客戶端mysql代碼都不會執行與字符集轉換相關的任何操作,所以我會假定這些只是傳遞字節,而不關心它們的解釋。所以你只需要確保服務器正確解釋這些字節。

從你給出的例子來看,如果一個文件變成了一個文件,我會說你的文件在ISO-8859-2,但是數據庫的讀取方式不同,最有可能是ISO-8859-1。您應該確保您的數據庫實際上可以接受其列的所有ISO-8859-2字符。閱讀character set support上的MySQL手冊,並設置一些合適的默認字符集(可能是數據庫級別的最佳字符集),即utf8(首選)或latin2。您可能必須重新創建表格才能應用此更改。

接下來,您應該設置連接的字符集以匹配文件的字符集。所以utf8這裏肯定是錯的,要走的路還是latin2

  • 使用您當前的API [mysql_set_charset][8]("latin2")可以用來實現這一點。
  • 該頁面還介紹了與其他前端一起使用的等效方法。作爲替代方案,您可以使用查詢來設置:mysql_query(「SET NAMES'latin2';」);

畢竟這是做了,你也應該確保事情對於任何腳本從數據庫中讀取設置正確。換句話說,生成的HTML的字符集必須匹配MySQL會話的character_set_results。 Otheriwse很可能是事物正確存儲在數據庫中,但在向用戶顯示時仍然顯示爲中斷。如果您有選擇,那麼在這種情況下,我會說使用utf8,因爲這樣做可以在需要時隨時包含不同的數據。

如果仍然存在一些問題,您應該確定它們是在從文件讀取到php中,與php交換數據時,還是在以HTML呈現結果時。字符串"Petrovi\xc4\x87"是您的示例的utf8表示形式,"Petrovi\xe6"latin2形式。您可以使用這些字符串以已知編碼明確傳遞數據,或者根據其中一個字符串檢查傳入的傳入值。

+0

設置mysql_query(「SET NAMES'latin2'」);幾乎解決了我的問題。現在它只是從字符串中刪除字母「š」和「ž」,就像它們不在字符串中一樣。其他字母很好。 – 2012-07-22 07:31:24

+0

何時刪除,寫入或從數據庫中讀取數據時?通過檢查字符串的'LENGTH'來檢查它是否只有一個這樣的字母。 – MvG 2012-07-22 09:15:03

+0

strlen()給了我正確的字母數,但它只是不顯示當我瀏覽數據庫,也沒有當我在PHP生成HTML結果回聲輸出數據庫查詢 – 2012-07-22 10:55:56

-1

你可以添加你自己的。 CSV在phpmyadmin的 ...
導入 - >格式= CSV,然後點擊 「導入」

或者,如果你不想使用phpMyAdmin!

BULK INSERT csv_dump 
    FROM 'c:\file.csv' 
    WITH 
    ( 
     FIELDTERMINATOR = '\t', 
     ROWTERMINATOR = '\n' 
    ) 
+0

如果他不想使用phpMyAdmin,但PHP使用腳本或其他東西? – 2012-07-19 13:27:56

+0

使用第二個解決方案 – Julien 2012-07-19 13:31:07

0

如果文件和數據庫排序規則都是utf-8,那麼它不應該成爲將csv從csv導入數據庫的問題。

<?php 
db = @mysql_connect('localhost', 'user', 'pass'); 
@mysql_select_db('my_database'); 

$CSVFile = "file.csv"; 

mysql_query('LOAD DATA LOCAL INFILE "' . $CSVFile . '" INTO TABLE my_table 
    FIELDS TERMINATED BY "," LINES TERMINATED BY "\\r\\n";'); 

mysql_close($db); 

?> 
+0

它具有相同的結果。 – 2012-07-19 13:40:07