PHP向MySQL插入超大文本数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP向MySQL插入超大文本数据相关的知识,希望对你有一定的参考价值。

$conn=mysql_connect("localhost","root","") or die("数据库服务器连接错误".mysql_error());
mysql_select_db("db_database",$conn) or die("数据库访问错误".mysql_error());
mysql_query("set names gb2312");
$title=$_POST[txt_title];
$content=$_POST[txt_content];
$createtime=date("Y-m-d H:i:s");
$sql=mysql_query("insert into tb_affiche(title,content,createtime)values('$title','$content','$createtime')");
echo "<script>alert('添加数据成功!');window.location.href='add_affiche.php';</script>";
mysql_free_result($sql);
mysql_close($conn);

请看上面这段代码,当变量“$content”内容小的时候,是可以插入数据的,但当“$content”内容有几十万字的时候,就无法插入数据了。而且MySQL的content字段已设为LONGTEXT属性了。不知怎么解决呢?请帮忙一下,谢谢!
要改MySQL的什么设置的,请详细提供一下操作步骤好吗?谢谢!!!
服务器最大响应时间,最大上传限制,要怎么改呢???我用的是MySQL Server 5.1版,mysql.ini是没有max_allowed_packet项的。php.ini里参数“max_execution_time”和“post_max_size”都改了,还是不行。

最大上传数也要改一下的,不然你那几十万字也估计超过你的最大上传限制了,还有,如果你的那个只是文本的话,可以考虑用MYSQL的压缩,怎么用我就不废话了。主要是设定两个东西:
服务器最大响应时间;最大上传限制,这两个高好了就行。其他一般不会有问题。你试一下。

补充:
在php.ini里有个参数叫“max_execution_time”,这个是最大响应时间,以秒为单位,改个大一点的,“post_max_size ”,这个是最大上传的大小, 以M为单位。
上回忘了个了很重要的东西,就是要重启你的服务进程(linux下),重启APM(WIN下)
参考技术A 首先确保longtext够用,然后确保mysql最大包够大,应该就可以了,最大包在mysql.ini里改 max_allowed_packet
max_allowed_packet=32M

没有是可以加的还有许多东西没有呢 ,把“max_allowed_packet=32M ”填在mysql.ini最后另起一行就好
修改后腰重启服务

你可以用语句select @@max_allowed_packet 查看目前的最大包限制
参考技术B 建议使用longblob类型吧。这是二进制方式,不需要设定大小,在mysql中存储图片时也可以用这种编码方式。

使用 PHP(垃圾文本)将希伯来文本插入 MySQL

【中文标题】使用 PHP(垃圾文本)将希伯来文本插入 MySQL【英文标题】:Inserting Hebrew text into MySQL using PHP (garbage text) 【发布时间】:2011-11-29 07:00:31 【问题描述】:

我在将希伯来文文本插入 mysql 时遇到了一个奇怪的问题。 基本上问题是: 我有一个 php 脚本,它从 csv 文件中提取希伯来文文本,然后将其发送到 mysql 数据库。数据库和表的所有字段的字符集都设置为 UTF8,排序规则设置为 utf8_bin。但是当我使用 mysql 插入它时,随机垃圾值出现在文本中,这使得它对输出完全无用。注意:我仍然可以看到一半的单词正确显示。 这是我的作业,可能会帮助您理解: 1. 正如我提到的,表格字符集和排序规则是 utf8。 2. 我发送了 header('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)

    在我的 php.ini 文件中添加了 default_charset = "UTF-8"。 我不知道 csv 文件中使用的编码,但是当我用 notepad++ 打开它时,编码是没有 BOM 的 utf-8。 以下是实际垃圾的示例: 原文 : שייפת utf8_encode 后的文字:×©× ×פת 同一脚本中 utf8_decode 之后的文本:שי יפת(完美) 文本发送到mysql数据库:ש×? ×?פת(注意中间的 ?) 如果我们从 mysql 回显文本:ש�? ??פת(输出关闭) 在utf8_encoding 之前使用了addlashes 和stripslashes。 (即使没有运气也试过) 服务器在运行 xamp 1.7.4 的 Windows 上 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

【问题讨论】:

我使用 utf8_general_ci,也许它会更适合你。顺便说一句,没有 BOM 的 utf8 很好。使用 mysql_real_escape_string 而不是添加斜杠 感谢您的快速回复,但我忘了提到我已经尝试了 mysql_real_escape_string 和更改排序规则并将其更改为 utf_general_ci,没有运气。 【参考方案1】:

我也有这个问题。这条线解决了它:

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

莎娜托娃

【讨论】:

嗨,还有那些吗?在mysql表中。 将csv保存到db的php文件是否也编码为utf8而没有BOM? 嗨,它是用 ANSI 编码的,只是在 utf 中创建了该文件的副本,仍然是相同的垃圾条目! 抱歉,我没办法了...尝试使用 mb_detect_encoding 和 mb_convert_encoding 您好,我更新了问题,请您阅读 EDIT 2 和 EDIT 3 吗?【参考方案2】:

使用 Text/LongText 代替 varchar。也使用排序规则作为 utf8_general_ci

希望这会帮助你@Ajit

【讨论】:

有点晚了,但设置为 Text 确实解决了这个问题(虽然不是一个合适的解决方案,因为我确实想要 varchar 类型进行搜索等)。

以上是关于PHP向MySQL插入超大文本数据的主要内容,如果未能解决你的问题,请参考以下文章

PHP Mysql-插入多条数据

Javascript PHP/MySQL - 将数据库中的行值插入文本字段

无法将俄语文本插入mysql数据库

将用户输入从文本框插入到数据库(使用 mysql 的 PHP 到 PHPMYADMIN)代码由于某种原因不起作用

MySQL插入数据

超大表上的 MySQL 数据库性能选择