2012-07-19 162 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