1

我在当前尝试调试的查询中注意到 GROUP BY 存在问题。我有一个具有以下结构的数据库表(从实际生活中减少):

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 转换以及许多其他方式 - 几乎所有我能想到的。

另一个奇怪的事情是,它似乎在分组时混淆了 Y 和 Ü(大写 U 和变音符号)的值(例如,分组时 ABC-Y 和 ABC-Ü 被认为是相同的)。

服务器在 Ubuntu x64 上运行 MySQL 5.5:

mysqld  Ver 5.5.29-0ubuntu0.12.04.2-log for debian-linux-gnu on x86_64 ((Ubuntu))
4

1 回答 1

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 扩展,可以消除这个严格的要求。它经常发生

于 2013-05-23T14:41:00.757 回答