我正在面对将希伯来语文本插入到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并使用echo时,它仍然完美显示。
5.我使用mysql_connect后的这些数据
使用PHP(垃圾文本)将希伯来语文本插入到MySQL中
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 = 'utf-8',character_set_client字符= 'utf-8',是character_set_connection = 'utf-8',character_set_database = 'utf-8',被character_set_server = 'utf-8'”,$ CON)
- 在我的php.ini文件中添加了default_charset =“UTF-8”。
- 我不知道在csv文件中使用的编码,但是当我用notepad ++打开它时,编码是utf-8,没有BOM。
- 下面是实际的垃圾样本:
原文:שי函数utf8_encode后יפת
文本:ש××פת
在同一个脚本utf8_decode后的文本:שייפת(完美)
文本发送到MySQL数据库:ש×? ×?פת(注意两者之间)
文本如果我们从mysql回显:ש ? (输出关闭) - utf8_encoding之前使用的addslashes和stripslashes。 (即使没有运气试过)
- 服务器是运行在Windows XAMP 1.7.4
- 的Apache 2.2.17
- 的MySQL 5.5.8(社区服务器)
- PHP 5.3。5(VC6 X86 32位)
编辑1:只是为了澄清,我并搜索类似问题的网站,并实施中发现的建议(集名UTF8和很多其他的选择等),但它没” t锻炼。所以请不要将这个问题标记为重复。
编辑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
我使用utf8_general_ci,也许它会为你工作好。 utf8没有BOM是好的btw。使用mysql_real_escape_string而不是addslashes – galchen
感谢您的快速响应,但我忘了提到我已经尝试了两种,mysql_real_escape_string和更改和更改排序规则到utf_general_ci,没有运气。 – Ajit