首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL意外的字符串比较行为

问MySQL意外的字符串比较行为
EN

Stack Overflow用户
提问于 2021-05-26 15:10:13
回答 1查看 31关注 0票数 2

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

我有一个应用程序表和一个根据“elmah_error”列过滤行的查询。"application“被定义为排序规则为utf8_general_ci的varchar(60)列

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

代码语言:javascript
复制
SELECT application, COUNT(*) FROM elmah.elmah_error GROUP BY application;

/LM/W3SVC/3/ROOT    3330
/LM/W3SVC/4/ROOT    350

这表明应用程序只有两个不同的值,总行计数为3,680。为了以防万一,我用下面的查询再次检查了这一点。

代码语言:javascript
复制
SELECT DISTINCT application FROM elmah.elmah_error;

/LM/W3SVC/3/ROOT
/LM/W3SVC/4/ROOT

和

代码语言:javascript
复制
SELECT COUNT(*) FROM elmah.elmah_error;

3680

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

代码语言:javascript
复制
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,但事实并非如此。

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

代码语言:javascript
复制
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

基于trim和like变体的工作,我最初怀疑'/LM‘前面可能有一个隐藏字符

但是,SELECT DISTINCT LENGTH(application) FROM elmah.elmah_error表示所有值的长度都为16。这一点以及GROUP BY application和DISTINCT application查询的结果似乎表明,看不见的字符可能不是这样的。

有没有人能解释一下这里发生了什么?

EN

回答 1

Stack Overflow用户

发布于 2021-05-26 15:16:56

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

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67700120

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档