SQL SELECT 查询不适用于电子邮件地址
Posted
技术标签:
【中文标题】SQL SELECT 查询不适用于电子邮件地址【英文标题】:SQL SELECT query not working with Email Addresses 【发布时间】:2015-09-10 21:35:01 【问题描述】:我正在尝试查询存储在我的数据库中的电子邮件地址以进行登录。我在 php 中的查询存在问题,当我尝试在 PHPMyAdmin 中使用 SQL 进行查询时,它返回一个空集。在进行了一些测试后,我确定了某封电子邮件的以下内容:something@gmail.com:
作品:
SELECT * FROM `Careers` WHERE `Email` LIKE '%something%' and
SELECT * FROM `Careers` WHERE `Email` LIKE '%gmail.com%' and
SELECT * FROM `Careers` WHERE `Email` LIKE '%@%'.
不起作用:
SELECT * FROM `Careers` WHERE `Email` LIKE 'something@gmail.com' and
SELECT * FROM `Careers` WHERE `Email` LIKE '%something@gmail.com%' and
SELECT * FROM `Careers` WHERE `Email` LIKE '%@gmail.com%'
SELECT * FROM `Careers` WHERE `Email` LIKE '%something%gmail.com'
我完全不知道如何纠正这个问题。我能想到的唯一想法是 @ 符号有问题,因为当我添加 @ 符号时,查询似乎失败了。您能提供的任何帮助将不胜感激!
【问题讨论】:
你确认最后一行'Works'和'Doesn't work'吗?因为Works的最后一行包含一个'@',而Not Work的最后一行不包含它。 @LaurentCrivello 是的,我已经在我的数据库上执行了这些查询。我不确定为什么最后一个“不工作”失败而最后一行“工作”失败。 @Nmaduro 我无法重现您的问题 [link]sqlfiddle.com/#!9/e9e21/3 你试过转义@符号吗? \@ 我更熟悉 Oracle 或 SQLServer 语法,所以不是 100% 确定 也许:***.com/questions/7230068/… 在 oracle set define off 将关闭用户定义的性质。也许 mysql 有一个默认设置已更改为不再忽略 @ 作为用户变量。 【参考方案1】:您确定它不起作用吗?在此处查看证明它有效的证明http://sqlfiddle.com/#!9/26b00/4。但是你应该改变你的查询,如下所示
SELECT * FROM table1 WHERE `Email` = 'something@gmail.com' -- No need of LIKE operator
SELECT * FROM table1 WHERE `Email` = 'something@gmail.com' -- No need of LIKE operator
SELECT * FROM table1 WHERE `Email` LIKE '%@gmail.com' -- search before string
SELECT * FROM table1 WHERE `Email` LIKE 'something_gmail.com' -- search a single char
编辑:
根据您的最新评论,您的排序规则armscii8_general_ci
是这里的问题。例如创建表像
CREATE TABLE Table1
(`email` varchar(19) collate armscii8_general_ci)
;
INSERT INTO Table1
(`email`)
VALUES
('something@gmail.com')
;
在下面返回select * ...
;如您所见,.
变成了©
类型的版权符号,这就是带有LIKE
运算符的通配符不起作用的原因。
something@gmail©com
更改您的查询以使用_
通配符和LIKE
运算符来匹配任何单个字符,它会正常工作。见http://sqlfiddle.com/#!9/ec46f/8
SELECT * FROM Table1 WHERE `Email` LIKE 'something@gmail_com';
【讨论】:
@Sachu,是的,甚至我也做了同样的声明,但在搜索整个字符串文字时,不需要 LIKE 运算符,这就是一个,试图指向这里。 哦好的..抱歉没有检查小提琴:) @Sachu 也许与数据库的整理方式有关?我正在使用 armscii8_general_ci。 Fiddle 没有说明使用了什么排序规则。有什么想法吗? @NMaduro,是的,这就是这里的问题;如果有帮助,请参阅答案中的编辑。 @Sachu 你会推荐什么作为我使用的排序规则?顺便说一句,非常感谢!这让我发疯了好几个星期!大声笑【参考方案2】:使用正则表达式的力量!只需一个 where 语句即可解决此问题:
select * from site_form
where email REGEXP '^[A-Za-z0-9._%\-+!#$&/=?^|~]+@[A-Za-z0-9.-]+[.][A-Za-z]+$';
【讨论】:
以上是关于SQL SELECT 查询不适用于电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章