Вставка текста на иврите в MySQL с использованием PHP (мусорный текст)

У меня возникла странная проблема с вставкой текста на иврите в mysql.

В основном проблема заключается в следующем:
У меня есть сценарий php, который берет текст на иврите из файла csv, а затем отправляет его в базу данных mysql. Кодировка как базы данных, так и всех полей таблиц установлена ​​на UTF8, а параметры сортировки - на utf8_bin. Но когда я вставляю его с помощью mysql, внутри текста появляется случайное значение мусора, что делает его совершенно бесполезным для вывода. ПРИМЕЧАНИЕ. Я все еще вижу, что половина слов отображается правильно.

Вот моя домашняя работа, которая может помочь вам понять:
1. Как я уже упоминал, кодировка таблицы и сопоставление - utf8.
2 . Я отправил заголовок ('Content-Type: text / html; charset = utf-8')
3. Если я повторяю текст, он отображается идеально. Когда я конвертирую его с помощью utf-8_encode, он конвертируется правильно. (например, שי יפת преобразуются в × © × × × ¤ × ª)
4. Когда я использую utf-8_decode для преобразованной переменной и использую эхо, оно все равно отображается идеально.
5. Я использовал эти после mysql_connect

mysql_query ("SET character_set_client = 'utf8';");
mysql_query ("SET character_set_result = 'utf8';");
mysql_query ("SET NAMES 'utf8'");
mysql_set_charset ('utf8');

и даже пробовал это:
mysql_query ("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'», $ con)

  1. В мой файл php.ini добавлен default_charset = "UTF-8".
  2. Мне неизвестна кодировка, используемая в файле csv, но когда я открываю его с помощью блокнота ++, кодировка - utf-8 без спецификации.
  3. Вот образец фактического мусора:
    исходный текст: שי יפת
    текст после utf8_encode: × © × ×× ¤ × ª
    текст после utf8_decode в том же скрипте: שי יפת (perfect)
    отправка текста в базу данных mysql: × © ×? ×? × ¤ × ª (обратите внимание на знак?)
    текст, если мы выводим эхо из mysql: ש�? �? פת (вывод близок)
  4. Перед utf8_encoding использовались добавочные косые черты и полосы косых черт. (даже попробовал, когда не повезло)
  5. Server is on windows running xamp 1.7.4
    • Apache 2.2.17
    • MySQL 5.5.8 (Сервер сообщества)
    • PHP 5.3.5 (VC6 X86 32 бит)

РЕДАКТИРОВАТЬ 1: Просто чтобы уточнить, что я искал на сайте похожие вопросы и реализовал найденные предложения (SET NAME UTF8 и многие другие параметры и т. Д.), Но это не сработало. Поэтому, пожалуйста, не помечайте этот вопрос как повторяющийся.

РЕДАКТИРОВАТЬ 2: Вот полный сценарий:

    <?php
header('Content-Type: text/html; charset=utf-8'); 

if (isset($_GET['filename'])==true)
{
$databasehost = "localhost";
$databasename = "what_csv";


$databaseusername="root";
$databasepassword="";
$databasename= "csv";

$fieldseparator = "\n";
$lineseparator = "@contact\n";


$csvfile = $_GET['filename'];
/********************************/


if(!file_exists($csvfile)) {
    echo "File not found. Make sure you specified the correct path.\n";
    exit;
}

$file = fopen($csvfile,"r");

if(!$file) {
    echo "Error opening data file.\n";
    exit;
}

$size = filesize($csvfile);

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

$csvcontent = fread($file,$size);

fclose($file);

$con = @mysql_connect($databasehost,$databaseusername,$databasepassword) or die(mysql_error());

mysql_query( "SET NAMES utf8" );
mysql_set_charset('utf8',$con);
/*
mysql_query("SET character_set_client = 'utf8';"); 
mysql_query("SET character_set_result = 'utf8';");

mysql_query("SET NAMES 'utf8'");
mysql_set_charset('utf8');

mysql_query("SET character_set_results = 'utf8', character_set_client = 'utf8', character_set_connection = 'utf8', character_set_database = 'utf8', character_set_server = 'utf8'", $con);
*/

@mysql_select_db($databasename) or die(mysql_error());



$lines = 0;
$queries = "";
$linearray = array();

foreach(explode($lineseparator,$csvcontent) as $line) {

$Name="";
$Landline1="";
$Landline2="";
$Mobile="";
$Address="";
$Email="";
$IMEI="temp";
$got_imei=false;

//echo $line.'<br>';
    $lines++;

    $line = trim($line," \t");

    $line = str_replace("\r","",$line);

    $linearray = explode($fieldseparator,$line);
    //check for values to insert
    foreach($linearray as $field)
    {
    if (is_numeric($field)){ $got_imei=true;$IMEI=trim($field);}
    if (stristr($field, 'Name:')) {$Name=trim(str_replace("Name:", "", $field));}   
    if (stristr($field, 'Landline:')) {$Landline1=trim(str_replace("Landline:", "", $field));}  
    if (stristr($field, 'Landline2:')) {$Landline2=trim(str_replace("Landline2:", "", $field));}    
    if (stristr($field, 'Mobile:')) {$Mobile=trim(str_replace("Mobile:", "", $field));} 
    if (stristr($field, 'Address:')) {$Address=trim(str_replace("Address:", "", $field));}
    if (stristr($field, 'Email:')) {$Email=trim(str_replace("Email:", "", $field));}



    }
    if ($got_imei==true)
    {

    $query = "UPDATE $databasetable SET imei=$IMEI where imei='temp'";
        mysql_query($query);

    }



    else if (($Name=="") &&  ($Landline1=="" ) && ($Landline2=="")  && ($Mobile=="")  && ($Address=="")) {echo "";}
    else
    {
        //$Name = utf8_encode("$Name");
        //$Name = addslashes("$Name");
        $Name = utf8_encode(mysql_real_escape_string("$Name"));

        echo"$Name,$Landline1,$Landline2,$Address,$IMEI<br>";
        $query = "insert into $databasetable (imei, name, landline1, landline2, mobile, address, email) values('$IMEI','$Name', '$Landline1','$Landline2','$Mobile', '$Address', '$Email');";
        mysql_query($query);
        $Name = utf8_decode(($Name));   
        echo $Name."<br>";

    }
}
@mysql_close($con);



echo "Found a total of $lines records in this csv file.\n";

}
?>


<form>
Enter file name <input type="text" name="filename" /><br />
<input type="submit" value="Submit" /><br>
NOTE : File must be present in same directory as this script. Please include full filename, for example filename.csv.
</form>

Вот образец файла csv:

@contact
Name: שי יפת
Mobile: 0547939898

@IMEI
355310042074173

РЕДАКТИРОВАТЬ 3:

Если я ввожу строку напрямую через cmd, я получаю следующее предупреждение:

Warning Code : 1366
Incorrect string value: '\xD7\xA9\xD7\x99 \xD7...' for column 'name' at row 1

Вот кое-что, что я нашел в сети, что может быть связано, есть ли помощь? http://bugs.mysql.com/bug.php?id=30131


person Ajit    schedule 02.10.2011    source источник
comment
Я использую utf8_general_ci, может быть, у вас это сработает лучше. utf8 без спецификации, кстати. используйте mysql_real_escape_string вместо addlashes   -  person galchen    schedule 02.10.2011
comment
Спасибо за быстрый ответ, но я забыл упомянуть, что пробовал как mysql_real_escape_string, так и изменение и изменение сопоставления на utf_general_ci, не повезло.   -  person Ajit    schedule 02.10.2011


Ответы (2)


Используйте Text / LongText вместо varchar. Также используйте Collation как utf8_general_ci

Надеюсь, это поможет вам @Ajit

person besin    schedule 13.12.2012
comment
Abit late, но установка Text решила эту проблему (хотя и не подходящее решение, так как мне нужен тип varchar для поиска и т. Д.). - person Ajit; 17.01.2013

У меня тоже была эта пробема. Эти строки решают это:

mysql_query( "SET NAMES utf8" );
mysql_query( "SET CHARACTER SET utf8" );

Шана Това

person Alon Eitan    schedule 02.10.2011
comment
Привет, все еще получаете? в таблице mysql. - person Ajit; 02.10.2011
comment
файл php, который сохраняет csv в db, также закодирован в utf8 без спецификации? - person Alon Eitan; 02.10.2011
comment
Привет, это было закодировано в ANSI, только что была создана копия этого файла в utf, все те же записи мусора! - person Ajit; 02.10.2011
comment
извините, у меня нет идей ... попробуйте поработать с mb_detect_encoding и mb_convert_encoding - person Alon Eitan; 02.10.2011
comment
Привет, я обновил вопрос, не могли бы вы прочитать EDIT 2 и EDIT 3? - person Ajit; 02.10.2011