У меня странная проблема с вставкой текста на иврите в mysql.
В основном проблема заключается в следующем:
У меня есть PHP-скрипт, который берет текст на иврите из CSV-файла, а затем отправить его в базу данных MySQL. Кодировка базы данных и всех полей таблиц установлена в UTF8, а сопоставление - в utf8_bin. Но когда я вставляю его, используя mysql, случайное значение мусора появляется внутри текста, что делает его совершенно бесполезным для вывода. ПРИМЕЧАНИЕ. Я все еще вижу, что половина слов отображается правильно.
Вот моя домашняя работа, которая может помочь вам понять:
1. Как я уже говорил, таблица charset и сопоставление utf8.
2. Я отправил заголовок ('Content-Type: text / html; charset = utf-8')
3. Если я повторяю текст, он выглядит идеально. Когда я конвертирую его, используя utf-8_encode
это преобразовано должным образом. (например, שי יפת преобразуется в × © × × × ¤ × ª)
4. Когда я использую utf-8_decode для преобразованной переменной и использую echo, он все равно отображается отлично.
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)
- Добавлено default_charset = "UTF-8" в моем файле php.ini.
- Мне неизвестно о кодировке, используемой в CSV-файле, но когда я открываю его с помощью notepad ++, используется кодировка utf-8 без спецификации.
- Вот пример фактического мусора:
Оригинальный текст: שי יפת
текст после utf8_encode: × © × × × ¤ × ª
текст после utf8_decode в том же скрипте: שי יפת (идеально)
отправка текста в базу данных mysql: × © ×? ×? × ¤ × ª (обратите внимание на? Между)
текст, если мы эхо от MySQL: ש ? ? פת (выход близок)
- Используется addlashes и stripslashes перед utf8_encoding. (даже пытался после неудачи)
- Сервер на Windows работает под управлением xamp 1.7.4
- Apache 2.2.17
- MySQL 5.5.8 (Сервер совместной работы)
- PHP 5.3.5 (VC6 X86 32bit)
РЕДАКТИРОВАТЬ 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