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 查询不适用于电子邮件地址的主要内容,如果未能解决你的问题,请参考以下文章

使 javascript 字符串 sql 友好

解密不适用于在加密数据上使用解密值查询的记录

SQL - 如果存在不适用于 Select 语句?

多个 SQL 查询不适用于 DBeaver 上的分隔符

sql查询不适用于doctrine 2

用于查找无效电子邮件地址的MySql脚本