我有一个令我讨厌的问题!
我有一个拥有数千名用户的数据库。数据最初来自一个我无法信任数据的数据库,因此我将其导入另一个“清理”数据库以删除重复的条目。
我执行了查询:
SELECT uid, username
FROM users
GROUP BY username
HAVING COUNT(username)>1
这是我目前状态的表格样本:
uid forename surname username
1 Jo Bloggs jobloggs
2 Jo Bloggs jobloggs
3 Jane Doe janedoe
4 Jane Doe janedoe
执行上述查询后,我得到以下示例结果:
uid forename surname username
2 Jo Bloggs jobloggs
如您所见,有2个重复用户,但查询只显示其中一个。
当我执行查询时,我得到300~结果。显然,如果查询没有提取所有重复项,我不能相信这个结果集是准确的,不能继续进行清理。
关于我可以尝试的任何想法?
由于
菲尔
答案 0 :(得分:0)
对于返回的结果集没有很好的解释。
根据示例数据和您的查询,您应该获得第二行:
3 janedoe
(实际上,无论你是否返回3或4的uid值,都是随意的。)
此外,请确保您的客户端仅返回行的子集,例如SQLyog有一个“限制行”功能,它限制了返回的行数。
如果这不是问题,那么最可能的解释是'janedoe'中的一个包含不可打印的字符,或者你有一些邪恶的字符转换正在进行,其中两个不同的编码显示相同的值。< / p>
作为快速的第一步,我建议您检查每个'janedoe'值中的字符数:
SELECT username, LENGTH(username) FROM mytable WHERE uid IN (3,4) ORDER BY uid
此外,您可以尝试显示实际编码,使用HEX()函数查看是否存在差异。 (注意:我不清楚在HEX之前或之后是否发生字符集翻译,我们在此之后是Oracle DUMP()函数的MySQL等价物,它将显示实际值的逐字节表示。 )
你有可能将一些Latin1编码修改成UTF-8,反之亦然,或者其他一些字符奇怪的事情发生了。这可能会给你一些想法...
SELECT username
, HEX(username)
, HEX(BINARY username)
, CONVERT(BINARY username USING latin1)
, CONVERT(BINARY username USING utf8)
FROM mytable
WHERE uid IN (3,4)
ORDER BY uid