我在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'无济于事。我意识到将一切都设置为修剪后的值会很简单,但我很好奇这个问题是什么。
答案 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
,表示搜索字符串与实际值之间的差异是空格。它实际上并不表示差异是在数据库值的开头还是结尾,但考虑到搜索的其他属性,可以安全地为您的目的假设。