MySQL意外的字符串比较行为



我很难理解字符串比较在MySQL中是如何工作的。(我使用的是MySQL社区服务器版本8.0.14(

我有一个elmah_error表和一个基于";应用程序";柱"应用程序";定义为具有utf8_general_ci排序规则的varchar(60)

如果我运行下面的查询,我会得到以下结果:

SELECT application, COUNT(*) FROM elmah.elmah_error GROUP BY application;
/LM/W3SVC/3/ROOT    3330
/LM/W3SVC/4/ROOT    350

这表明应用程序只有两个不同的值,总行数为3680。以防万一,我已经用以下查询对此进行了双重检查。

SELECT DISTINCT application FROM elmah.elmah_error;
/LM/W3SVC/3/ROOT
/LM/W3SVC/4/ROOT

SELECT COUNT(*) FROM elmah.elmah_error;
3680

但是,如果我运行以下查询,我不会得到预期的结果。

SELECT COUNT(*) FROM elmah.elmah_error 
where application = '/LM/W3SVC/3/ROOT';
984

SELECT COUNT(*) FROM elmah.elmah_error 
where application <> '/LM/W3SVC/3/ROOT';
350

我希望第一个查询返回3330,两个查询加起来为3680,但没有。

但是,如果我运行以下任何一个查询,我都会得到预期的结果。

SELECT COUNT(*) FROM elmah.elmah_error 
WHERE UPPER(application) = '/LM/W3SVC/3/ROOT';
SELECT COUNT(*) FROM elmah.elmah_error 
WHERE TRIM(application) = '/LM/W3SVC/3/ROOT';
SELECT COUNT(*) FROM elmah.elmah_error 
WHERE application LIKE '%/LM/W3SVC/3/ROOT';
3330

根据trimlike变体的工作情况,我最初怀疑在"/LM"之前可能有一个隐藏字符

然而,SELECT DISTINCT LENGTH(application) FROM elmah.elmah_error指示所有值都具有16的长度。这一点,以及GROUP BY applicationDISTINCT application查询的结果似乎表明,不可见字符可能并非如此。

有人能告诉我这里发生了什么吗?

我推测您的表可能使用了不区分大小写的排序规则。因此,值/LM/W3SVC/3/ROOT可能具有其他变体,其中并非所有字符都是大写的。要测试这一点,请尝试您的第一个聚合查询-区分大小写的排序规则:

SELECT application COLLATE SQL_Latin1_General_CP1_CS_AS, COUNT(*) AS cnt
FROM elmah.elmah_error
GROUP BY application COLLATE SQL_Latin1_General_CP1_CS_AS;

最新更新