【问题标题】:MySQL real escape - Own escape - o to ö?MySQL 真正的逃脱 - 自己的逃脱 - o 到 ö?
【发布时间】:2017-04-16 20:57:26
【问题描述】:

我想转义所有要插入数据库的字符串。但我的问题是,因为我有超过 10.000 个字符串要检查,所以数据库查询会太多......

所以我使用了这个转义函数,我在 stackoverflow.com 中找到了它:

function escape($value) {
    $return = '';
    for($i = 0; $i < strlen($value); ++$i) {
        $char = $value[$i];
        $ord = ord($char);
        if($char !== "'" && $char !== "\"" && $char !== '\\' && $ord >= 32 && $ord <= 126)
            $return .= $char;
        else
            $return .= '\\x' . dechex($ord);
    }
    return $return;
}

它正在工作。但我的问题是,我没有任何öä 或类似的字符...

在我调用这个函数之前,我有一个这样的字符串:Königsedition,在我调用这个函数之后,我应该得到K\xc3\x83\xc2\xb6nigsedition。但问题是,由于某些原因,我的数据库中出现了Kxc3xb6nigsedition...

我怎样才能把它转回Königsedition

或者,有没有其他方法可以转义字符串,而不使用SQL真正的转义函数,因为那时我必须要超过10.000个SQL查询,才能转义一个字符串并保留@ 987654329@ 格式化? (我更喜欢这种方式!)

您好,谢谢!

【问题讨论】:

  • 参数化查询呢?
  • "for some reason" 你在你的数据库中得到一个字符串......不是因为你没有调用那个“转义”函数。由于执行了 INSERT 或 UPDATE 语句,您将在数据库中获得一个字符串。如果您要插入从该“转义”函数返回的字符串,那么这将是您在数据库中获取字符串的“原因”。我不明白为什么你会期望一个字符串 different 与你插入的字符串不同。为什么要“使用此转义功能”?我不明白目的。
  • 只需使用带有绑定占位符的准备好的语句,并提供要插入的字符串的值。确保作为值传递的字符串的编码 匹配 为 MySQL 客户端和列指定的字符集。 dev.mysql.com/doc/refman/5.7/en/charset-connection.html

标签: php mysql string escaping mysql-real-escape-string


【解决方案1】:

您不必“转义”到字符串的编码。确保表格、连接和您的输入都具有相同的编码(如 UTF-8)。

对于您的表格,请确保列(最好是表格本身)具有 utf8_general_ci 排序规则。

如果您使用 PDO,请将 ;charset:utf8 添加到您的 DSN,或者如果您不使用 PDO,请在运行其他查询之前执行查询 SET NAMES utf8。带有字符集的 DSN 示例是 mysql:host=HOSTNAME;dbname=DATABASE;charset=utf8

确保您的页面采用 UTF-8 编码,为 HTML 页面发送 Content-Type 标头 Content-Type: text/html; charset=utf-8,以便浏览器以 UTF-8 发送内容(按表单)。

【讨论】:

  • 为什么需要'escape',如果你只是使用参数化查询或者PDO的quote()方法,应该没问题
  • 排序规则也很重要。仅 UTF-8 是不够的。确保正如@Dygnus 所说,您的所有表(和数据库)都设置为 utf8_general_ci 或 utf8_unicode_ci - 无论您选择哪种排序规则,都相同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2019-09-21
  • 2016-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多