0

我在 phpmyadmin 中运行一个简单的选择。查询是:

SELECT email FROM users
WHERE users.email LIKE 'user1@email.com'
OR  users.email LIKE 'user2@email.com'
OR  users.email LIKE 'user3@email.com'

此查询返回一个空集。另一方面,使用通配符的相同查询:

SELECT email FROM users
WHERE users.email LIKE 'user1@email.com%'
OR  users.email LIKE 'user2@email.com%'
OR  users.email LIKE 'user3@email.com%'

返回

user1@email.com
user2@email.com
user3@email.com

我不知道为什么这两个查询不返回相同的结果。也许该字段中有不可打印的字符或空白?没有通配符的查询是完全错误的吗?如果它是不可打印的字符或空格,我如何判断它是什么字符?我试过 'user1@email.com' 无济于事。我意识到将所有内容设置为其修剪值很简单,但我很好奇问题出在哪里。

4

3 回答 3

2

我认为可能有一些尾随字符(通常是空格或换行符)。

您可以尝试连接一些控制字符串进行检查:

SELECT concat(">>", email , "<<") FROM users
WHERE users.email LIKE 'user1@email.com%'
OR  users.email LIKE 'user2@email.com%'
OR  users.email LIKE 'user3@email.com%'

或者更容易您可以返回电子邮件的长度:

SELECT email, length(email) FROM users
WHERE users.email LIKE 'user1@email.com%'
OR  users.email LIKE 'user2@email.com%'
OR  users.email LIKE 'user3@email.com%'
于 2013-11-08T16:06:25.320 回答
1

根据文档:“模式不必是文字字符串”。

如果你想匹配一个精确的值。你可以使用这个sql语句:

SELECT email FROM users
WHERE users.email in('user1@email.com', 'user2@email.com', 'user3@email.com'); 

或者如果您仍想使用通配符:

SELECT email, length(email) FROM users
WHERE users.email LIKE '%user1@email.com%'
OR  users.email LIKE '%user2@email.com%'
OR  users.email LIKE '%user3@email.com%' 
于 2013-11-08T16:11:08.430 回答
1

如果问题不是“即使有不可打印的字符,我怎样才能让这个查询工作?” 但相反,“我怎样才能弄清楚哪些不可打印的字符正在破坏我的查询?” 您可以尝试以下方法:

SELECT REPLACE(HEX('user1@email.com '), HEX('user1@email.com'), '') FROM users
WHERE users.email LIKE 'user1@email.com%';

如果有问题的字符是一个简单的空格,上面的查询应该返回20,表明您的搜索字符串和实际值之间的差异是一个空格。它实际上不会指示差异是在数据库值的开头还是结尾,但是考虑到搜索的其他属性,可以安全地假设您的目的。

于 2013-11-08T16:27:36.387 回答