pdo:从包含反斜杠的db中选择字段

y3bcpkx1  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(298)

我有这张table

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 ,我可以看到数据库正在接收此查询:

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

当我在phpmyadmin中直接使用这个查询时,它也不会返回任何结果。
我怎么处理这种案子?
绝对没有改变数据库中数据的选项。

t3psigkw

t3psigkw1#

许多产品(php、mysql等)使用反斜杠作为转义字符。
就其本身而言,它通常是通过对后面的角色做一些事情来消耗的。例如, a\tb 把信给你 a 以及 b 由制表符分隔(通常的解释是 \t ).
将反斜杠加倍 \\xyz 通常是这样解释的:第一个反斜杠逃逸第二个,所以你得到 \xyz .
如果您的字符串经过多个代码层(例如,pdo加mysql),那么您可能需要两倍的反斜杠,因为每一层都会发生变化 \\ 进入 \ .
另一个诊断工具是 SELECT HEX(col) ... 查看数据库中存储的内容。示例:

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

返回代码:

$params = array(':name' => "My Shop No. \6\");

\6 is probably treated as just "6" (not everything has some escaped meaning)
\" possibly caused a syntax error.  Normally this is now to get a " inside a string

'My Shop No. \\6\\'

现在将成对的反斜杠转换为单个反斜杠,然后将字符串交给下一个。
(在这些上下文中,单引号和双引号的作用是相同的。)

相关问题