PDO:从数据库中选择包含反斜杠的字段

时间:2018-11-15 13:04:31

标签: mysql pdo mariadb

我有这张桌子

ID|name
----------------
1 |My Shop No. \6\

(不要问为什么六个在反斜杠内,我不知道,我只需要使用它)

我尝试从我的表中选择此特定值。 我的查询如下:

$sql = "SELECT `id` FROM shops WHERE `name` = :name";
$params = array(':name' => "My Shop No. \6\");
$this->fetchOne($sql, $params); // the binding happens in my mysql class

此查询不返回任何数据,表明没有条目。 当我使用Neor Profiler SQL监视SQL语句时,可以看到数据库正在接收以下查询:

SELECT `id` FROM shops WHERE `name` = 'My Shop No. \\6\\'

当我直接在PHPMyAdmin中使用此查询时,它也不返回任何结果。

我该如何处理这种情况?

绝对没有办法更改数据库中的数据。

1 个答案:

答案 0 :(得分:0)

许多产品(PHP,MySQL等)都使用反斜杠作为转义符。

本身,通常是通过对角色后的角色进行操作来消耗它们。例如,a\tb为您提供由制表符分隔的字母ab\t通常解释)。

将反斜杠\\xyz加倍通常是 ,因此:第一个反斜杠转义了第二个反斜杠,因此得到\xyz

如果您的字符串通过多层代码(例如PDO和MySQL),则可能需要两倍的反斜杠,因为每一层都将\\变成{{1} }。

另一个诊断工具是\,以查看数据库中存储了什么。例子:

SELECT HEX(col) ...

返回您的代码:

610962    a\tb  -- a=61, tab=09, b=62
615C7462  a\\tb -- a=61, \=5C, t=74, b=62 

现在将成对的反斜杠转换为单个反斜杠,然后将字符串交给下一个。

(在这些上下文中,单引号和双引号的作用相同。)