2014-12-21 65 views
0

我需要从可以包含特殊characteres例如领域做出选择选择特殊characteres的MySQL

+--------------+ 
| code   | 
+--------------+ 
| **4058947"_\ | 
| **4123/"_\ | 
| sew'-8947"_\ | 
+--------------+ 

我试试这个

select code from table where code REGEXP '[(|**4058947"_\|)]'; 
select code from table where code REGEXP '[(**4058947"_\)]'; 
select code from table where code REGEXP '^[(**4058947"_\)]'; 

但querys返回空

所有行和该查询返回
select code from table where code REGEXP '^[(**4058947"_\)]$'; 

我只需要返回第一个或指定的

+0

在一个正则表达式中,大多数反斜杠是特殊字符。如果使用'\\'(双反斜杠)而不是单个? – 11684

+0

反斜杠是代码名称中的字段的一部分 – user3680275

+0

是的,我看到了。但是您在SQL语句中使用的正则表达式可能不起作用,因为反斜杠是转义字符(如在Java/PHP/JavaScript中),所以您应该自行转义它。此外,您还需要在正则表达式中转义代码字段中的其他特殊字符。 (即'*','|','('和')')。 – 11684

回答

0

要选择只有一行,你可以这样做,如果它不关心哪一个。

SELECT code FROM table LIMIT 1 

如果确实事,放下正则表达式。

SELECT code FROM table WHERE code = "**4058947\"_\\" 

匹配那些特殊字符(在这种情况下,"\),你需要“逃”出来。 (这就是它的名字,我没有弄明白。)在大多数主流语言中,这是通过在它前面加一个反斜杠来完成的(MySQL也是这样做的)。反斜杠是转义字符,后面带有另一个字符的反斜杠被称为转义序列。正如你所看到的,我避开了我想要匹配的代码值中的引号和反斜杠,所以它现在应该可以工作。


如果你需要保持正则表达式(我希望不是这样的,因为你必须要匹配对文本字符串)同样的道理也适用。退出引号和反斜杠,如果你删除括号和括号,你会好起来的。请注意,在正则表达式中,您需要转义更多的字符。这是因为某些字符(例如:| []() * +在正则表达式中有一个特殊的功能,这非常方便,但当您需要将字符串与该字符匹配时会变得有点麻烦,在这种情况下,您需要这是因为MySQL首先解析查询,并在遇到无效转义序列时抛出一个错误(也就是说,如果你转义了一个你不需要根据MySQL逃脱的字符),那么只有这样是正则表达式解析的结果,双反斜杠替换为单反斜杠,这很快变得很难看,因为这意味着匹配一个反斜杠和一个MySQL正则表达式需要4个反斜杠!两个在正则表达式中,但这需要加倍,因为MySQL首先将它解析为一个字符串!