2011-09-29 88 views
7

我遇到了一个非常不寻常的MySQL问题,涉及反斜杠。基本上,当我做一个通配符匹配像\ n的是在数据库中的文本,而不是实际的换行符,它只会返回一个比赛,如果我刚才右手通配符:在MySQL中使用通配符搜索反斜杠时奇怪的行为

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'); 

感谢您抽出时间来阅读。

+1

奇怪,对我来说工作很好。你使用的是哪个mysql版本? – Jim

+2

+1,有趣的问题。我赞扬你提供了关于如何创建结构和插入样本数据的正确信息。很棒的第一篇文章 –

+1

我在这里复制它。版本:mysqld版本5.1.49 - 在i686上使用suse-linux-gnu(SUSE MySQL RPM) –

回答

6

它使用左侧通配符时,对我的作品与反斜线:

mysql> SELECT * FROM `tmptest` WHERE `a` LIKE '%\\\\\\n%'; 
+-----------------+ 
| a    | 
+-----------------+ 
| \n    | 
| \n\ndfsdfsdfs\n | 
+-----------------+ 
2 rows in set (0.00 sec) 

使用mysqld的版本49年1月5日


@Karolis据我了解LIKE运算符的表达式应该被解析两次,因此\\\\在与LIKE一起使用时会变成\

但如何解释这种(使用表达式 “回\斜线”):

SELECT 'back\\slash' LIKE '%back\\\\slash%'; - > TRUE(正常行为)

SELECT 'back\\slash' LIKE '%back\\\\\slash%'; - > TRUE

SELECT 'back\\slash' LIKE '%back\\\\\\slash%';(5个反斜杠?) - > TRUE(6个反斜杠?)

SELECT 'back\\slash' LIKE '%back\\\\\\\slash%'; - (7个反斜杠)> TRUE

SELECT 'back\\slash' LIKE '%back\\\\\\\\slash%'; - > FALSE(正常行为,我猜..)

然而,如果只为 “\” 搜索:

mysql> SELECT 'back\\slash' LIKE '%\\\\%'; - > FALSE(但应工作)

mysql> SELECT 'back\\slash' LIKE '%\\\\\%'; - > TRUE(5个反斜杠)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\%'; - > TRUE(6个反斜杠)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\\%'; - > FALSE(7个反斜杠)

对于THI小号特定问题,可以使用不同的转义字符|与完全绕开这个问题(如果没有|字符出现):

mysql> SELECT 'back\\slash' LIKE '%\\%' ESCAPE '|'; - > TRUE

因此,也许一些MySQL的大师那里可以说明这一点。我根本做不到。也在不同的机器上用mysql 5.1.53进行测试。观察到同样的行为。当我开始评论时,它是一个相当有趣的问题。

+0

你懂了,非常感谢。传奇的! – Adam

+2

@Qsp你有解释吗? – Karolis

+0

此外,对于任何未来阅读此内容并试图在PHP脚本中使用它的人来说,查询将需要用撇号而不是引号,并且需要12个反斜杠。 – Adam

0

基于QSP答案(因为我感谢他为我节省了一天)。我会说使用黑色。 我不明白为什么像QSP和Karolis,但如果你用mySQL中的5个slash替换1个斜杠(或10个php),它仍然可以像QSP那样工作。

但是好东西,如果你用QSP提示的12个反斜杠(或24个php)替换'\\',它将不起作用。但如果用10个反斜杠(或者20个PHP)替换它,它仍然可以工作。

我希望可以帮助某人作为QSP回答已被接受。

编辑:
它,如果你工作得很好:
%\\\\\%
%\\\\\\\\\\%
%K \\\\\\ %
%\\\\\%
%k \\\ s%(如果只有1斜线就像回\ slash)
但它不起作用如果你这样做:
%K \\\\\\\\\\%
%K \\\\\%
%\\\\\ S%
我会孔蒂看看为什么。