最近在写刁钻层的时候,有问题。 使用like进行模糊搜索时,输入下划线,无法准确查询数据,返回所有数据。
这是出于好奇,在百度之后发现的。 因为本来有些特殊字符必须转义才能查询。
请先理解什么是特殊字符。
在ascii代码表中,特殊字符的范围如下: 即32~47 58~64 91~96 123~126。
模糊查询时,转换有两种方法。
使用REGEXP_LIKE方法。 这是一种使用正则表达式进行查询的方法,因此如果存在此字符(如$ * ),则必须进行转义才能进行查询。 因为转义字符是反斜杠,所以反斜杠也会旋转。 这里只讨论文字中包含字符串的情况,不讨论正则表达式的匹配。
使用like关键字根据escape关键字进行转义。
字符匹配操作可以使用通配符“%”和“_”。
% :表示任意字符,包含零个;
_ :表示任意字符; 上面输入下划线会检测到所有内容,因为如果有任何一个字符,就会被检查。
此外,对于单引号,在oracle中,like语句中的'与前面的单引号匹配,例如select * fromtabletestwheret.name like ' % ' % ' escape '' 使用转义符号不会正常结束。 必须将单个单引号转换为两个单引号: select * fromtabletesttwheret.name like ' % ' % ' escape ''
因此,上面的两个字符和用于转义的字符(通常使用反斜杠)必须转义。
那么,问题还在于,在Java代码中,如果使用JDBC的预编译语句进行预编译,不是就不用转义了吗?
just do it!
答案是否定的,还是需要逃脱? 注意,以下没有进行逃脱,所检测的结果仍然是所有记录。
逃跑的话会变得准确。
也请注意两点:
1. jdbc自动加单引号。 分配值时不需要添加单引号
2. jdbc自动将一个单引号转换为两个。 分配值时不需要写两个单引号