MySQL使用LENGTH(CONCAT)查询姓名长度超10字符数据返回全表问题
问题成因
- 误用
LENGTH()函数统计长度:LENGTH()返回的是字节长度,若字段使用utf8等多字节编码,1个中文/全角字符占24字节。如果你实际需要筛选的是*字符数超过10*,那么`LENGTH(CONCAT(name,forname))>10`对应的实际字符数阈值仅为35,只要表中所有数据的拼接后字符数都达到这个阈值,就会返回全表。 - WHERE条件被意外注释:如果SQL语句末尾意外加了
--或#等MySQL注释符,会导致长度判断条件被注释,最终等价于执行全表查询,返回所有数据。 - 字段名拼写错误:如果
forname是拼写错误的字段名,而表中正好存在同名字段且值均为长字符串,也可能导致所有数据都满足判断条件。
解决方法
- 替换长度统计函数:如果需要按字符数统计筛选,把
LENGTH()替换为CHAR_LENGTH(),该函数返回的是字符数,不受编码类型影响,修改后的语句如下:
SELECT * FROM name_of_table WHERE CHAR_LENGTH(CONCAT(name, forname)) > 10;
- 检查SQL语句完整性:确认WHERE后所有条件没有被注释符截断,不存在多余的
--、#或/* */注释块包含了判断条件。 - 核对字段名:确认
name、forname是表中实际存储名字、姓氏的字段,没有拼写错误。 - 若字段存在NULL值的可能,可以用
CONCAT_WS('', name, forname)替换CONCAT,避免单个字段为NULL时拼接结果返回NULL导致筛选遗漏。
内容的提问来源于stack exchange,提问作者Joker
相关产品推荐
相关产品推荐

