-1

問題が1つあります。私はExcelファイルをCSVとして保存しており、そのファイルをPHPで読み取り、mysqlに挿入する必要がありますが、問題はcharセット、特にčćšđžにあります。私は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_results、MySQLセッションの文字セットと一致する必要があります。そうしないと、データベースに正しく保存されていても、ユーザーに表示されたときに壊れているように見える可能性があります。選択肢があれば、その場合に使用すると思いますutf8。そうすることで、必要に応じてさまざまなデータを簡単に含めることができるからです。

いくつかの問題が残っている場合は、ファイルからphpに読み込んでいるとき、mysqlとデータを交換しているとき、または結果をHTMLで表示しているときに問題があるかどうかを特定する必要があります。文字列"Petrovi\xc4\x87"utf8例を表したもので"Petrovi\xe6"あり、latin2フォームです。これらの文字列を使用して、既知のエンコーディングでデータを明示的に渡すか、これらの文字列の1つに対して着信転送値をチェックできます。

于 2012-07-21T14:42:29.180 に答える
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);

?>
于 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 に答える