SQLite SELECT DISTINCT异常:同列值重复显示问题求助
解决SQLite中DISTINCT无法去重看似相同字符串的问题
问题根源
你遇到的问题是因为从其他程序复制的字符串中包含不可见的特殊字符(比如零宽空格、控制字符、非标准空白字符等)——这些字符肉眼无法分辨,但在SQLite中会被视为不同的字符串,导致DISTINCT无法正确去重。
排查验证
执行以下SQL可以直观看到差异:
-- 查看每个category的字符长度和十六进制字节表示 SELECT category, LENGTH(category), HEX(category) FROM tbltest GROUP BY category;
执行后你会发现,两个看似相同的"aa",它们的LENGTH值或HEX结果不一致——比如一个是标准的6161(对应ASCII的"aa"),另一个可能带有额外的字节(如零宽空格的E2808B)。
解决方法
1. 临时清洗查询结果
如果只是需要正确的去重结果,可以用正则表达式移除常见的不可见字符(SQLite需要启用正则表达式扩展):
SELECT DISTINCT REGEXP_REPLACE(category, '[\x00-\x1F\x7F-\x9F\u200B-\u200F\uFEFF]', '') AS cleaned_category FROM tbltest;
如果无法使用正则扩展,也可以针对性替换已知的特殊字符,比如零宽空格:
SELECT DISTINCT REPLACE(category, X'E2808B', '') AS cleaned_category FROM tbltest;
2. 彻底修复数据
如果需要永久修复数据库中的数据,可以执行更新语句:
UPDATE tbltest SET category = REGEXP_REPLACE(category, '[\x00-\x1F\x7F-\x9F\u200B-\u200F\uFEFF]', '');
3. 预防措施
后续从外部程序复制字符串时,先粘贴到纯文本编辑器(如Notepad++、VS Code的纯文本模式)中过滤特殊字符,再导入到SQLite;或者在插入数据前先做清洗处理。
内容的提问来源于stack exchange,提问作者kris adidarma
相关产品推荐
相关产品推荐

