Php 在MySQL中插入字符串时出现问题

Php 在MySQL中插入字符串时出现问题,php,mysqli,Php,Mysqli,嗯,我试着解释一下,但请原谅我的英语 我有一个脚本,它将整个数据库转储到一个SQL文件中,然后另一个脚本拆分行并执行它们以删除、创建和插入数据。 问题是有些字符串被“修剪”。它只需插入字符串,直到到达第一个特殊字符,例如: 对于字符串: "Pantalon azul marino de Poliéster con cinta blanca bordada con el nombre de la institución en uno de sus costados." 只需插入: "Panta

嗯,我试着解释一下,但请原谅我的英语

我有一个脚本,它将整个数据库转储到一个SQL文件中,然后另一个脚本拆分行并执行它们以删除、创建和插入数据。 问题是有些字符串被“修剪”。它只需插入字符串,直到到达第一个特殊字符,例如:

对于字符串:

"Pantalon azul marino de Poliéster con cinta blanca bordada con el nombre de la institución en uno de sus costados."
只需插入:

 "Pantalon azul marino de Poli"
不会抛出任何错误。但这只会使用脚本发生,但当我手动运行查询并在phpMyAdmin中导入SQL文件时,一切都正常。 顺便说一下,所有设置都设置为utf8

我没有主意了,任何帮助都将不胜感激

    include ('../core/connection.inc.php');
    $conn = dbConnect('admin');
    $conn->query("SET NAMES 'utf8'");
    $conn->set_charset("utf8");
    $type = 0;

    // Temporary variable, used to store current query
    $templine = '';
    // Read in entire file
    $lines = file('db-backup.sql');
    // Loop through each line
    $correct = 0;
    $failed = 0;
    foreach ($lines as $line){
    // Skip it if it's a comment
    if (substr($line, 0, 2) == '--' || $line == '')
        continue;
    // Add this line to the current segment
    $templine .= $line;
    // If it has a semicolon at the end, it's the end of the query
    if (substr(trim($line), -1, 1) == ';'){
        $templine = str_replace("latin1","utf8",$templine);
        $templine = trim($templine);

        // Perform the query
        $conn->query($templine);
        $errno = $conn->errno;
        $error = $conn->error;
        if($conn->affected_rows > 0){
            echo "OK: (".$templine.")<br/>";
            $correct++;
        } else {
            echo "Failed: (".$templine.")<br/>";
            echo "&nbsp;&nbsp; Errno: ".$errno." <br/>";
            echo "&nbsp;&nbsp; Error: ".$error." <br/>";
            $failed++;
        }
        $templine = '';
    }
    }
include('../core/connection.inc.php');
$conn=dbConnect('admin');
$conn->query(“设置名称‘utf8’”);
$conn->set_字符集(“utf8”);
$type=0;
//临时变量,用于存储当前查询
$templine='';
//读取整个文件
$lines=file('db-backup.sql');
//每行循环一次
$correct=0;
$failed=0;
foreach($line作为$line){
//如果是评论,请跳过它
if(substr($line,0,2)='--'| |$line='')
继续;
//将此行添加到当前线段
$templine.=$line;
//如果它的末尾有一个分号,那么它就是查询的结尾
if(substr(修剪($line),-1,1)=';'){
$templine=str_replace(“拉丁文1”、“utf8”和$templine);
$templine=修剪($templine);
//执行查询
$conn->query($templine);
$errno=$conn->errno;
$error=$conn->error;
如果($conn->受影响的行>0){
回显“OK:(“$templine.”)
; $correct++; }否则{ echo“失败:(“$templine.”)
; 回显“Errno:.$Errno.”
; 回显“错误:.”错误“
”; $failed++; } $templine=''; } }
我不知道你的桌子是什么样子,但我可以给你一些额外的建议以防万一。确保将DB cols设置为UTF8:

ALTER TABLE {table_name} CHANGE COLUMN {col_name} {col_name} TEXT CHARACTER SET 'utf8' COLLATE 'utf8_general_ci' NOT NULL ;

我猜您要导入的转储文件不是UTF-8

PHP将字节从文件传输到MySQL,而不进行任何转换。根据您所做的更改,文件中的
é
字符可能在
latin1
中,可能由一个值大于127的字节表示。这不是UTF-8。您已经向MySQL承诺将发送有效的UTF-8,当字符串到达无效字节时,它将停止读取字符串

你可以考虑:

  • 将转储文件重新编码为UTF-8
  • 找出转储文件的编码,并使用该编码将其加载到MySQL中
就我个人而言,我认为我应该以不同的方式处理这个问题:

  • 使用命令行客户端或类似工具将转储文件加载到MySQL中。你知道这是有效的
  • 导入后更改每一列的字符集-您可以使用
    information\u schema
    中的数据来组装
    Alter TABLE
    语句,并让MySQL正确地进行转换

  • 检查表的字段大小。我建议您将字段大小增加为
    varchar(256)
    或more@SatishSharma该字段是文本类型:/显然,它必须与字符串中包含的音译一起被截断。您可以从mysql命令行手动插入字符串而不截断它吗?截断,就是这个词。好吧,没有简单的方法来表达这一点,但是。。。什么是mysql命令行?x) 。但是,如果这对您有所帮助,那么在phpMyAdmin中复制和粘贴SQL输入中的SQL文件内容时,它会起作用,在我直接导入此文件时,它也会起作用。当insert查询完成时,当它输出$templine变量时,它不会被截断。请找到要在脚本(php)或编码中使用的正确字符集。我不知道是哪一个,但从截短部分的位置看很明显。它不接受Poliéster这个词上的字符。或者删除您的utf8。忘记了细节,但是您可能在utf8中对这些特殊字符进行了两次编码。很明显,您的UTF-8中有一个无效字符——MySQL读取它并阻塞,因此停止了传输。可以导入一个非UTF-8.sql文件,但是您必须告诉phpMyAdmin(或其他什么)该文件的确切编码,以便它可以动态地将其转换为UTF-8。如果文件中存在混合编码,那么您就有麻烦了。如果转储文件未编码为UTF-8,那么当我将文件作为UTF-8编码文件导入phpMyAdmin时,是否也会失败?无论如何,我不知道确切的原因,但是删除“Set name”和“Set Charset”行是有效的。所以,现在,我将保持这种方式,但无论如何,我将检查“转储”脚本,可能是编码问题,而不是“导入”脚本中的问题。