在MySQL中插入字符串的问题

时间:2014-02-06 05:00:11

标签: 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."

它只是插入:

 "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 = '';
    }
    }

2 个答案:

答案 0 :(得分:2)

我猜你导入的转储文件不是UTF-8。

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

您可以考虑:

  • 将转储文件重新编码为UTF-8
  • 确定转储文件的编码方式,并使用该编码将其加载到MySQL中

我个人认为我会以不同的方式解决问题:

  1. 使用命令行客户端或类似的东西将转储文件加载到MySQL中。你知道这很有效。
  2. 导入后更改每列的字符集 - 您可以使用information_schema中的数据汇编ALTER TABLE语句并让MySQL正确进行转换。

答案 1 :(得分:0)

我不知道你的桌子是怎么样的,但我可以给你一些额外的建议以防万一。确保将DB cols设置为UTF8:

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