我遇到了一个非常不寻常的MySQL问题,涉及反斜杠。基本上当我使用LIKE进行通配符匹配\ n \ n \ n \ n它在数据库中作为文本而不是实际换行符时,如果我只有一个右手通配符,它将只返回一个匹配项:
SELECT *
FROM `tmptest`
WHERE `a` LIKE '\\\\n%'
现在,如果我这样查询,它将不会返回任何内容:
SELECT *
FROM `tmptest`
WHERE `a` LIKE '%\\\\n%'
从表中的数据可以看出,两个查询都应该匹配。我不确定这是否是我遗漏的东西,或者我错误地转移了换行符,但是第一个查询无法正常工作而第二个查询没有意义。
表格结构:
CREATE TABLE IF NOT EXISTS `tmptest` (
`a` varchar(22) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
示例数据:
INSERT INTO `tmptest` (`a`) VALUES
('\\n'),
('\\n\\ndfsdfsdfs\\n');
感谢您花时间阅读本文。
答案 0 :(得分:6)
使用左侧通配符时,它对我有 6 反斜杠:
mysql> SELECT * FROM `tmptest` WHERE `a` LIKE '%\\\\\\n%';
+-----------------+
| a |
+-----------------+
| \n |
| \n\ndfsdfsdfs\n |
+-----------------+
2 rows in set (0.00 sec)
使用mysqld Ver 5.1.49
@Karolis据我所知,LIKE
运算符的表达式应该被解析两次,因此当与LIKE一起使用时,\\\\
会变成\
。
但是如何解释这个(使用表达式“back \ slash”):
SELECT 'back\\slash' LIKE '%back\\\\slash%';
- > TRUE(正常行为)
SELECT 'back\\slash' LIKE '%back\\\\\slash%';
- >是的(5个反斜杠?)
SELECT 'back\\slash' LIKE '%back\\\\\\slash%';
- >是的(6个反斜杠?)
SELECT 'back\\slash' LIKE '%back\\\\\\\slash%';
- >是的(7个反斜杠?)
SELECT 'back\\slash' LIKE '%back\\\\\\\\slash%';
- > FALSE(正常行为,我猜......)
然而,如果只搜索“\”:
mysql> SELECT 'back\\slash' LIKE '%\\\\%';
- >错误(但应该有效)
mysql> SELECT 'back\\slash' LIKE '%\\\\\%';
- > TRUE(5个反斜杠)
mysql> SELECT 'back\\slash' LIKE '%\\\\\\%';
- > TRUE(6个反斜杠)
mysql> SELECT 'back\\slash' LIKE '%\\\\\\\%';
- > FALSE(7个反斜杠)
对于这个特定问题,可以使用不同的转义字符|
并完全绕过问题(如果没有|
字符出现):
mysql> SELECT 'back\\slash' LIKE '%\\%' ESCAPE '|';
- > TRUE
所以也许有些mysql大师可以解释一下。我根本不能。还在另一台机器上使用mysql 5.1.53 进行了测试。观察到相同的行为。正如我从评论开始,这是一个相当有趣的问题。
答案 1 :(得分:0)
基于QSP答案(因为我感谢他救了我的一天)。
我会说使用 5 blackslashes。 我不明白为什么像QSP和Karolis,但是如果你用mySQL中的5个slaches(或者php中的10个)替换1个斜杠,它仍然可以像QSP说的那样工作。
但好事,就是如果你更换' \\'如QSP所示,通过12个反斜杠(或php中的24个),它不会起作用。但如果用10个反斜杠替换它(或者用php中的20个反斜杠),它仍然可以工作。
我希望可以帮助某人,因为QSP答案已被接受。
编辑:
如果您这样做,它可以正常工作:
%\\\\\%
%\\\\\\\\\\%
%K \\\\\\\\\\ S%
%\\\\\\\\\\ S%
%k \\\\\ s%(如果只有1个斜杠,如back \ slash)
但如果你这样做,它就无法发挥作用:
%K \\\\\\\\\\%
%K \\\\\%
%\\\\\ S%
我会继续看看为什么。