我注意到我正在尝试调试的查询中有GROUP BY的问题。我有一个具有以下结构的DB表(从实际现实中减少):
CREATE TABLE IF NOT EXISTS `product_variants` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`product_id` int(11) unsigned NOT NULL DEFAULT '0',
`pid_merchant` varchar(50) NOT NULL,
`checksum` char(32) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `checksum` (`checksum`),
KEY `product_id` (`product_id`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
在此表中,我有以下2行(其他许多数百万行):
INSERT INTO `product_variants` (`id`, `product_id`, `pid_merchant`, `checksum`) VALUES
(525555236, 628702710, 'ARTüöäß111', 'af5334b1193bf171580c70813ac83327'),
(525555241, 628702710, 'ARTüöäß222', 'cfe50fd9c3ca29fd957b839892313f82');
我正在调试的查询正在尝试根据pid_merchant
在此表中查找重复条目,这非常简单:
SELECT count(*), pv.* FROM product_variants pv WHERE pv.pid_merchant != '' GROUP BY pv.pid_merchant HAVING count(*) > 1
我的问题是这两个结果都匹配,即使实际的pid_merchant
值不同 - 一个结束于111,另一个结束于222.有谁知道如何处理这个问题?我已经尝试通过MD5()和HEX()进行分组,将排序更改为latin1_german2_ci,强制执行二进制或utf8转换以及许多其他操作 - 几乎我能想到的全部内容。
另一个奇怪的事情是,在分组时(例如ABC-Y和ABC-Ü在分组时被认为是相同的),它似乎会混淆Y和Ü(大写字母U和变音符号)的值。
服务器在Ubuntu x64上运行MySQL 5.5:
mysqld Ver 5.5.29-0ubuntu0.12.04.2-log for debian-linux-gnu on x86_64 ((Ubuntu))
答案 0 :(得分:1)
这不是变音符号(或通常是重音符号)
这是MySQL如何评估GROUP BY:它是非标准和随机的。标准SQL是这样的:
SELECT count(*), pv.product_id, pv.pid_merchant
FROM product_variants pv
WHERE pv.pid_merchant != ''
GROUP BY pv.product_id, pv.pid_merchant
HAVING count(*) > 1
所有非聚合列都应出现在GROUP BY中。
MySQL具有“有用的”MySQL扩展,可以消除这一严格的要求。它经常发生