我有这张桌子
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中使用此查询时,它也不返回任何结果。
我该如何处理这种情况?
绝对没有办法更改数据库中的数据。
答案 0 :(得分:0)
许多产品(PHP,MySQL等)都使用反斜杠作为转义符。
本身,通常是通过对角色后的角色进行操作来消耗它们。例如,a\tb
为您提供由制表符分隔的字母a
和b
(\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
现在将成对的反斜杠转换为单个反斜杠,然后将字符串交给下一个。
(在这些上下文中,单引号和双引号的作用相同。)