MySQL查询仅返回1行数据:LIKE '%on'未获取预期结果
排查
LIKE '%on'仅返回1行的问题 这种情况我在日常排查里碰到过好几次,大概率是数据细节或者查询的隐性规则出了问题,咱们一步步来梳理:
- 先排查隐形字符的坑
很多时候肉眼看着姓氏是以'on'结尾,但实际字段后面藏着空格、制表符或者其他不可见字符,导致LIKE '%on'匹配不上。你可以先跑这个查询确认:
SELECT Surname, LEN(Surname) AS 实际长度 FROM MyDB.myTable WHERE Surname LIKE '%on%'
对比显示的姓氏和它的实际长度,如果长度比你肉眼数的多,说明有隐形字符。解决的话可以用去空格函数预处理字段:
-- 通用版(不同数据库TRIM支持可能有差异,比如SQL Server也可以用LTRIM(RTRIM())) SELECT * FROM MyDB.myTable WHERE TRIM(Surname) LIKE '%on'
- 检查大小写敏感的问题
有些数据库的排序规则是区分大小写的,比如如果有姓氏是'On'或者'ON',你的小写%on就匹配不到。可以试试强制不区分大小写的查询:
-- SQL Server 示例:指定不区分大小写的排序规则 SELECT * FROM MyDB.myTable WHERE myTable.Surname COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%on' -- MySQL 示例:转成小写后匹配 SELECT * FROM MyDB.myTable WHERE LOWER(Surname) LIKE '%on'
- 用字符串函数替代LIKE做验证
有时候LIKE的通配符规则可能和你预期的不一样,试试用字符串截取函数直接判断结尾:
-- SQL Server 用RIGHT函数 SELECT * FROM MyDB.myTable WHERE RIGHT(Surname, 2) = 'on' -- MySQL 同样支持RIGHT,或者用SUBSTRING SELECT * FROM MyDB.myTable WHERE SUBSTRING(Surname, LENGTH(Surname)-1, 2) = 'on'
- 确认没有隐性过滤规则
比如有没有不小心加了其他WHERE条件?或者MyDB.myTable是不是你真正要查的那张表?有没有同名表在其他数据库里?另外也可以检查下有没有视图、触发器在偷偷过滤数据。
内容的提问来源于stack exchange,提问作者tony9099
相关产品推荐
相关产品推荐

