MySQL正则表达式查询不区分大小写。

12

在我的表中,我有名字和姓氏。一些名字是大写的(ABRAHAM),一些名字是小写的(abraham),一些名字以ucword开头(Abraham)。

因此,当我使用REGEXP '^[abc]'进行where条件时,我没有得到正确的记录。如何将名称更改为小写并使用SELECT QUERY?

SELECT * FROM `test_tbl` WHERE cus_name REGEXP '^[abc]';

以下是我的查询,如果记录为小写,则运行良好,但我的记录是中间的,我的所有客户名称都不是小写的,所有名称都像ucword。

因此,对于上述查询,我没有得到正确的记录显示。


2
你想解决什么实际问题?REGEXP 几乎总是错误的解决方案。 - zerkms
同时,我的正则表达式查询显示以U、V、W开头,所有字母,上述正则表达式不起作用。 - Bharanikumar
我还想搜索以a、b或c开头的名称。 - Bharanikumar
2
@zerkms 我很好奇,为什么正则表达式几乎总是一个错误的解决方案? - Jonathan
6
@Jonathan 我年轻时错了8年 :-) 这不是错误的解决方案 :-P - zerkms
1
@zerkms 哦!哈哈,我应该一定要检查日期的,谢谢您! - Jonathan
6个回答

23

我认为你应该查询数据库时确保名称已经转化为小写,假设name是你想要查找的名称,并且在你的应用程序中你已经将其转换为小写,那么你的查询应该像这样:

我认为你应该查询数据库时确保名称已经转化为小写,假设name是你想要查找的名称,并且在你的应用程序中你已经将其转换为小写,那么你的查询应该像这样:

SELECT * FROM `test_tbl` WHERE LOWER(cus_name) = name

由于我不知道你使用的是什么语言,所以我只提供了名字。但请确保这个名字是小写的,这样你就可以检索到 Abraham、ABRAHAM 或者任何该名称的变体!

希望能对你有所帮助!


正则表达式 '^[[:<:]]b.*[[:>:]]' 可以渲染以 b 字符开头的记录,但如果我添加或条件,那么它将显示 REGEXP '^[[:<:]]b.*|c.*[[:>:]]' 所有记录,即以 f、t、h、u 等任何字符开头,但根据我的条件,它应该仅呈现以 b 和 c 字符名开头的记录。 - Bharanikumar

10

你尝试过这个吗:

SELECT * FROM `test_tbl` WHERE LOWER(cus_name) REGEXP '^[abc]';

2

2
作为典型的MySQL,它有时候很敏感,有时候又不是。看起来有许多因素在起作用,如排序规则、类型、版本号等等。也许还有一些隐藏的随机数。毕竟他们想让你购买Oracle :) - John

1
在MySQL 8.0中,您可以使用"regexp_like"函数,并将"matching_type"参数设置为"c"以进行区分大小写匹配,或设置为"i"以进行不区分大小写匹配。
select id, name
from client
where regexp_like(name, '^[a-z]', 'c');

这个 SQL 语句将返回所有名称以小写字母开头的客户端。

您可以在此处查找更多信息: https://dev.mysql.com/doc/refman/8.0/en/regexp.html#function_regexp-like


0

你不需要使用正则表达式来搜索以特定字符串或字符开头的名称。

SELECT * FROM `test_tbl` WHERE cus_name LIKE 'abc%' ; 

%是通配符。搜索不区分大小写,除非您为列cus_name设置二进制属性或使用二进制运算符。

SELECT * FROM `test_tbl` WHERE BINARY cus_name LIKE 'abc%' ; 

5
你的查询搜索以字符串“abc”开头的名称,这与 OP 的查询非常不同,后者搜索以“a”或“b”或“c”开头的名称。 - codaddict
我假设用户正在尝试构建一个“搜索即时显示”字段/工具。 - aeon

0

已经提供了几个有效的选项,但这里有一个只使用正则表达式的选项:

SELECT * FROM `test_tbl` WHERE cus_name REGEXP '^[abcABC]';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接