没有通配符,mysql找不到数据

时间:2013-11-08 15:56:58

标签: php mysql

我在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'无济于事。我意识到将一切都设置为修剪后的值会很简单,但我很好奇这个问题是什么。

3 个答案:

答案 0 :(得分: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%'

答案 1 :(得分:1)

根据docs:'模式不必是文字字符串'。

如果您想匹配一个确切的值。你可以使用这个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%' 

答案 2 :(得分:1)

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

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

如果相关字符是简单空格,则上面的查询应返回20,表示搜索字符串与实际值之间的差异是空格。它实际上并不表示差异是在数据库值的开头还是结尾,但考虑到搜索的其他属性,可以安全地为您的目的假设。