使用SELECT DISTINCT仍出现USA重复记录的原因排查
解决SELECT DISTINCT下USA记录重复的问题
嘿,这个情况确实有点反直觉,我来帮你拆解下可能的原因和排查方向:
最常见的原因:多字段查询导致的"伪重复"
首先你得确认一下,你的SELECT语句是不是只包含countryCode这一个字段?比如如果你写的是:
SELECT DISTINCT countryCode, state FROM your_table;
那DISTINCT是基于整行所有字段的组合来判断重复的。如果两条USA的记录,state字段不同(比如一条是Alabama,另一条是别的州),那即使countryCode相同,也会被视为不同的行保留下来;而United Kingdom的记录可能所有其他字段都一致,所以被去重了。
如果是这个情况,你只需要单独查询countryCode就能看到正确的去重结果:
SELECT DISTINCT countryCode FROM your_table;
隐形字符或编码差异
如果已经是单独查询countryCode但仍有重复,那大概率是肉眼不可见的隐形字符在搞鬼,比如空格、制表符、换行符,或者全角/半角差异:
- 你可以用
LENGTH()函数查看字段长度,正常的USA长度应该是3,如果某条记录的长度是4,那肯定带了隐形字符:SELECT countryCode, LENGTH(countryCode) FROM your_table WHERE countryCode LIKE '%USA%'; - 还可以用
HEX()函数查看十六进制编码,正常USA的十六进制是555341,如果有一条是55534120(末尾多了空格的十六进制值),那就是空格导致的重复。
解决办法也很简单,用TRIM()函数去掉前后的空白字符:
SELECT DISTINCT TRIM(countryCode) FROM your_table;
如果想要彻底修复数据,可以执行更新:
UPDATE your_table SET countryCode = TRIM(countryCode) WHERE countryCode LIKE '%USA%';
排序规则导致的大小写/字符识别差异
少数情况下,数据库的排序规则也会影响DISTINCT的判断:
- 如果你的
countryCode字段用的是区分大小写的排序规则(比如utf8_bin),那USA和usa会被视为不同的值;而United Kingdom可能都是统一的大小写,所以没出现重复。 - 你可以查看表的创建语句确认排序规则:
SHOW CREATE TABLE your_table;
如果是这个问题,可以修改字段的排序规则为不区分大小写的(比如utf8_general_ci),或者用LOWER()统一转换后去重:
SELECT DISTINCT LOWER(countryCode) FROM your_table;
你可以先按上面的步骤排查,应该能很快找到问题所在!
内容的提问来源于stack exchange,提问作者Eddie Leach
相关产品推荐
相关产品推荐

