【问题标题】:Extended ascii characters in mySql with prepared statements带有准备好的语句的 mySql 中的扩展 ascii 字符
【发布时间】:2015-08-06 01:48:30
【问题描述】:

当使用准备好的语句和值绑定在 mysql 中插入(或更新)记录时,我在尝试插入包含扩展 ascii 字符 145(右单引号)的单词 child’s 时遇到了问题。 “d”之后的所有数据都被截断。这适用于插入任何 MS Word 奇数字符。我的表被编码为 utf8_general_ci 并且在我的代码中我一直是 utf-8。该字段的类型为“文本”。

当然,我可以将它们转义或通过str_replace() 删除它们(这是我选择做的),但我想了解为什么我不能直接插入它们,因为我一直认为准备好的语句处理了这个。

示例插入代码 - 不完整,但它显示了基本内容

$q = "INSERT INTO mytable (userid, title, descr) VALUES (?,?,?)";

if (!($stmt = $this->mysqli->prepare($q))) {
    error_log("You have a problem...");
    return false;
}
/* bind parameters for markers */
$stmt->bind_param("iss", $userid, $title, $descr);

/* execute query */
$stmt->execute();

if ($stmt->errno) {
    $e = new Exception;
    error_log("\r\nSql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error . "\r\n" . $e->getTraceAsString());
    return false;
} else {
    $lastinsertedid = $this->mysqli->insert_id;

    /* close statement */
    $stmt->close();
    return $lastinsertedid;
}

【问题讨论】:

  • 你一直使用 utf8 吗?

标签: php mysql encoding prepared-statement extended-ascii


【解决方案1】:

这应该不是问题,将参数绑定为字符串应该根据需要转义任何引号。

试试这个看看你是否能看到错误是什么。

    $stmt = $this->mysqli->prepare($q);
    if (!is_object($stmt))
        error_log("You have a problem...");
        var_dump($this->mysqli);
    }

附:不要忘记$stmt->execute() 之后的$stmt->close(),因为在尝试多个准备好的语句时会遇到不同步问题

我也可以提供一些关于语法清理的提示,请接受您更新的问题:

$q = "INSERT INTO mytable (userid, title, descr) VALUES (?,?,?)";
$stmt = $this->mysql->prepare($q);

if (!is_object($stmt))
    error_log("You have a problem...");
    var_dump($this->mysqli);
}

/* bind parameters for markers */
$stmt->bind_param("iss", $userid, $title, $descr);

/* execute query */
$stmt->execute();

if ($stmt->errno) {
    $stmt->close(); // Still need to close here

    $e = new Exception;
    error_log("\r\nSql Error: " . $q . ' Sql error #: ' . $stmt->errno . ' - ' . $stmt->error . "\r\n" . $e->getTraceAsString());
    return false;
}

/* close statement */
$stmt->close();

return $this->mysqli->insert_id;

【讨论】:

  • 我已经用下面的错误检查代码更新了我的帖子。它不会抛出任何错误并且插入得很好......除了截断以特殊字符开头的字符串。
  • 好的,这样就可以消除您发送的查询的任何问题。奇怪的是,作为一项草率的工作,您可以使用addslashes($title),甚至更糟糕的是使用htmlentities($title)。希望我有更铁的东西可以推荐给你。
  • 只有 TEXT 字段有这个问题吗?
  • 我相信是的。我在另一篇文章中看到标题字段也被截断。
【解决方案2】:

编码不是 utf8。这是唯一的问题。您的代码可能始终是 utf8,但数据不是。

child’sd 之后被截断的事实是非 utf8 字节被输入其他良好代码的症状。

找出正在生成 的应用程序或代码,或者弄清楚它正在生成什么编码,或者弄清楚它是否可以生成utf8。前一种情况需要修改一个设置,另一种情况不需要修改代码。

HEX('’') 是 utf8 格式的 E282AC

【讨论】:

  • 数据来自文本文件。 str_replace 选项目前正在工作。当使用iconv(mb_detect_encoding($text, mb_detect_order(), true), "UTF-8", $text); 或类似的东西读取文本文件时,我可能已经走上了逐行转换数据的路线。现在的问题是回头查找数据并在我继续前进时对其进行测试。如果可以,我稍后会验证。 - 谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 2012-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多