MySQL通配符与正则表达式搜过滤数据详解

bangongJIAO1@c 发布于 2025-11-29 阅读(2)
目录
  • 通配符过滤
    • 通配符 %
    • 通配符 _
    • 技巧
  • 正则表达式过滤
    • 字符匹配
    • 其他字符
  • 对比
    • 正则表达式测试
      • 总结

        通配符过滤

        通配符:用来匹配值的一部分特殊字符。

        通配符可以在搜索模式中任意位置使用,并且可以使用多个通配符。

        搜索模式:由字面值、通配符或者两者组合构成的搜索条件。

        语法(使用LIKE操作符):

        SELECT [column_name]
        FROM [table_name]
        WHERE [column_name] LIKE '[string]';
        

        通配符 %

        ‘%’ 表示任何字符出现任意次数,例如 LIKE ‘jet%’ 匹配词jet起头的值,‘%anvil%’ 匹配任何位置包含文本anvil的值。

        注意

        • 根据MySQL的配置方式,搜索可以是区分大小写的;
        • ‘%’ 可以匹配0个字符;
        • 值的尾空格会干扰通配符匹配,最好在搜索模式最后附加一个%;
        • ‘%’ 不能匹配NULL。

        通配符 _

        ‘_’ 只匹配单个字符。

        技巧

        • 不要过度使用通配符,因为这会很花时间;
        • 如有必要,使用通配符匹配在搜索的最后;

        正则表达式过滤

        语法(使用REGEXP操作符):

        SELECT [column_name]
        FROM [table_name]
        WHERE [column_name] REGEXP '[string]';
        

        字符匹配

        基本匹配:‘.’ 表示匹配任意一个字符。

        MySQL通配符与正则表达式搜过滤数据详解

        正则表达式匹配不区分大小写,使用BINARY关键字区分,例如WHERE prod_name REGEXP BINARY ‘JetPack .000’。

        • OR匹配:‘1000|2000’ 表示匹配1000或者2000。
        • 多字符匹配:‘[123]’ 表示匹配 1 或 2 或 3,是 [1|2|3] 的缩写。

        但是 ‘[1|2|3] Ton’ 和 ‘1|2|3 Ton’ 匹配结果并不相同,后者表示匹配 1 或 2 或 3 Ton。

        • 否定字符匹配:‘[^123]’ 表示匹配除这些字符外的任何东西。
        • 匹配范围:‘[0-9]’ 与 ‘[0123456789]’ 相同。‘[a-z]’ 匹配任意字母字符。
        • 匹配特殊字符:使用转义字符 ‘\&;,例如 ‘\.’ 、’ \|’ 、‘\[’ 、‘\&;。

        其他字符

        空白元字符

        元字符 说明
        \\f 换页
        \\n 换行
        \\r 回车
        \\t 制表
        \\v 纵向制表

        字符类

        说明
        [:alnum:] 任意字母和数字
        [:alpha:] 任意字符(同[a-zA-Z])
        [:blank:] 空格和制表
        [:cntrl:] ASCII控制字符(0-31和127)
        [:digit:] 任意数字
        [:graph:] 与[:print:]相同,但是不包括空格
        [:lower:] 任意小写字母
        [:print:] 任意可打印字符
        [:punct:] 既不在[:alnum:]也不在[:cntrl:] 中的任意字符
        [:space:] 包括空格在内的任意空白字符
        [:upper:] 任意大写字符
        [:xdigit:] 任意十六进制数字

        重复元字符

        元字符 说明
        * 0个或多个匹配
        + 1个或多个匹配
        ? 0个或多个匹配
        {n} 指定数目匹配
        {n, } 不少于指定数目的匹配
        {n, m} 匹配数目的范围(m不超过255)

        定位元字符

        元字符 说明
        ^ 文本的开始
        $ 文本的结尾
        [[:<:]] 词的开始
        [[:>:]] 词的结尾

        举例:

        SELECT prod_name
        FROM products
        WHERE prod_name REGEXP '^[0-9\\.]';
        

        MySQL通配符与正则表达式搜过滤数据详解

        对比

        如果匹配文本在列值中出现,则LIKE不会匹配,但是REGEXP会匹配。

        MySQL通配符与正则表达式搜过滤数据详解

        可以通过用 ^ 开始每个表达式,用 $ 结束每个表达式,使得REGEXP的作用和LIKE一样。

        正则表达式测试

        SELECT 'hello' REGEXP '[0-9]';	//结果返回0
        

        总结