-1

我有一个问题。我有保存为 CSV 的 excel 文件,我需要用 PHP 读取该文件并插入到 mysql 中,但问题是字符集特别是 čćšđž。我尝试了 utf8_encode() 以及我能想到的几乎所有东西。

示例:

它插入“Petroviæ”,但应该是“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();
?>
4

3 回答 3

1

首先:不鼓励使用这个 mysql 扩展。所以你可能想切换到别的东西。另请注意,您通过简单地粘贴字符串来编写查询的方式使其容易受到SQL 注入攻击。只有当你真的确定你阅读的文件内容不会有任何丑陋的意外时,你才应该这样做。

看来您的文件读取和客户端 mysql 代码都没有做任何与字符集转换相关的事情,所以我假设那些只是传递字节,而不关心它们的解释。因此,您只需确保服务器正确解释这些字节。

从您给出的示例来看, ć 变成了 æ,我会说您的文件在ISO-8859-2中,但数据库的读取方式不同,很可能是ISO-8859-1。您应该确保您的数据库实际上可以接受其列的所有 ISO-8859-2 字符。阅读有关字符集支持的 MySQL 手册,并将一些合适的默认字符集(可能在数据库级别上最好)设置为utf8(首选)或latin2. 您可能必须重新创建表才能应用此更改。

接下来,您应该设置连接的字符集以匹配文件的字符集。所以utf8这里肯定是错误的,还有latin2要走的路。

  • 使用您当前的 API,可以使用mysql_set_charset ("latin2") 来完成此操作。
  • 该页面还描述了与其他前端一起使用的等效方法。
  • 作为替代方案,您可以使用查询来设置:mysql_query(" SET NAMES 'latin2';");

完成所有这些之后,您还应该确保为从数据库读取的任何脚本正确设置了内容。换句话说,生成的 HTML 的字符集必须与character_set_resultsMySQL 会话的字符集匹配。否则,很可能是数据正确存储在您的数据库中,但在向用户显示时仍然出现损坏。如果您可以选择,我会说utf8在这种情况下使用,因为这样做可以更容易地在需要时包含不同的数据。

如果仍然存在一些问题,您应该确定它们是在从文件读取到 php 时,在与 mysql 交换数据时,还是在以 HTML 形式呈现结果时。该字符串"Petrovi\xc4\x87"utf8您的示例的表示形式,并且"Petrovi\xe6"latin2表单。您可以使用这些字符串显式地传递具有已知编码的数据,或者根据这些字符串之一检查传入的传输值。

于 2012-07-21T14:42:29.180 回答
0

it shouldn't be a problem importing a csv from a csv to a database if both the file and the database collation are utf-8.

<?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);

?>
于 2012-07-19T13:33:22.580 回答
-1

你可以添加你自己的。phpmyadmin中的 CSV ...
导入 -> 格式 = csv 并点击“导入”

或者,如果您不想使用 phpmyadmin !

BULK INSERT csv_dump 
    FROM 'c:\file.csv' 
    WITH 
    ( 
        FIELDTERMINATOR = '\t', 
        ROWTERMINATOR = '\n' 
    )
于 2012-07-19T13:26:58.083 回答