在 MySQL 中筛选同时包含字母和数字的字符串字段,核心思路是利用正则匹配,确认字段值里既有字母字符也有数字字符。相比使用多个 like 条件拼接,正则表达式写法更直观且易于维护。

使用 REGEXP 进行基础筛选
MySQL 的 REGEXP 运算符(或同义写法 RLIKE)支持 POSIX 正则表达式。要匹配同时包含字母和数字的字符串,可以用两个正向预判思路,或者直接用包含关系写表达式。
写法一:分别判断字母和数字都存在
最易读的方式是写两个条件,用 and 连接:字段正则能匹配到数字,且能匹配到字母。
-- 筛选 user_code 同时包含字母和数字 select * from user_table where user_code regexp '[0-9]' -- 包含数字 and user_code regexp '[a-zA-Z]'; -- 包含字母
写法二:用单条正则表达
如果希望只写一次正则,可以借助正则的“顺序无关”写法,比如利用两个 lookahead(部分 MySQL 版本支持有限,推荐用写法一)。更通用的单条写法是:
-- 同时包含字母和数字,不限制先后顺序 select * from user_table where user_code regexp '^(?=.*[0-9])(?=.*[a-zA-Z]).+$';
注意上述 lookahead 语法在 MySQL 8.0 的 REGEXP 中可能不被支持,此时应回到写法一。
处理大小写与字段类型
MySQL 正则默认大小写不敏感取决于字段排序规则。若字段为 binary 或使用了区分大小写排序,则 [a-z] 不会匹配大写。稳妥起见用 [a-zA-Z]。
| 需求 | 推荐写法 |
|---|---|
| 包含数字和字母 | regexp '[0-9]' and regexp '[a-zA-Z]' |
| 仅小写字母加数字 | regexp '[0-9]' and regexp '[a-z]' |
完整示例
下面给出一个建表与查询的完整可运行示例:
create table demo (
id int primary key auto_increment,
code varchar(50)
);
insert into demo(code) values
('abc123'), ('onlytext'), ('123456'), ('Ab9'), ('x y 1');
-- 筛选同时含字母和数字
select *
from demo
where code regexp '[0-9]'
and code regexp '[a-zA-Z]';
-- 结果会返回 abc123 和 Ab9
小结
在 MySQL 里筛选同时包含字母和数字的字符串字段,优先使用 regexp 配合 and 连接两个基础正则,既兼容性好又容易理解。避免在程序端做二次过滤,把规则下沉到数据库能显著提升查询表达力。