mysql 模糊查询,用户输入通配符‘_’和‘%’处理

        当项目使用mysql并对字段进行模糊搜索时,如果系统对字段的字符没有做到限制,就会经常出现用户输入下划线‘_’、百分号‘%’此类通配符进行搜索,如此执行往往会检索到错误的结果集,下滑线‘_’会匹配单个任意字符,百分号‘%’会匹配任意个任意字符。

        为了方便理解。for example:        在使用like进行模糊匹配时,常规写法为:field like CONCAT('%',变量,'%')     

                                                                那么结果为:   field like ‘%关键字%’,此时搜索出的结果是正确的。

        那么问题来了,当用户输入单个‘_’,此时执行的语句就是  field  like  ‘%_%’ , 此时匹配的结果就是整张表的全部数据。

        或者这样:

                        field  like  ‘%%%’  ,结果可想而知

解决方案

         一,使用INSTR替换like

                     INSTR不会识别通配符,只会判断第二个字符串参数在第一个字符串中是否存在。确保此论是有据可依的,上官网。


INSTR用法(官网截图)

        这里只是说明了该函数会将第二个参数在第一个参数第一次出现的首字母索引位置。通过广大网友的文档翻阅中发现该函数用于where字句中即可达到模糊查询的效果。

使用:

        select * form users where INSTR(users_name,‘用户输入’)  等同于 select * from users where users_name like   CONCAT('%','用户输入','%'),简单来说,INSTR就相当于java中的 string.contains("")方法


    二,使用转义字符‘\’

               '\%'会被转义为‘%’,同理‘\_’会被转义为‘_’,在你的编程语言过滤用户输入的值,遇到通配符就在前面填上‘\’

    三,使用ESCAPE转义

                使用(这个用的不熟,暂且举个例子吧)


示例

                这种写法的含义是字符‘/’后面的字符都被当成是普通字符,而不再是通配符,这样的做法回有问题,最后一个‘%’应该是被当做通配符处理才是正确的。

猜你喜欢

转载自www.cnblogs.com/lzwnodes/p/11653454.html