Php mysql LOWER函数与AES_DECRYPT配合使用

3

我在使用php mysql时,使用AES_ENCRYPT输入的数据已经以AES加密形式存储在数据库中,但是问题在于数据来自iphone,成员的“名字”以大写字母开头并作为大写字母存储。例如'Pooja'。

我想知道当我搜索以下内容时,为什么没有返回任何结果。

SELECT *
FROM member
WHERE LOWER(AES_DECRYPT(fname,'xxxxxxxxxxxxxxxxx')) LIKE'%$pooja%'

如果我不使用LOWER,它会给我“Pooja”。

请问有人能在这里纠正我吗?


你尝试过输出LOWER(AES...))的结果吗? - zerkms
它没有将输出转换为小写。 - vikas
你能举一个无法转换为小写的字符串的例子吗? - zerkms
2
默认情况下,MySQL具有不区分大小写的字符串比较功能,因此您可能不需要LOWER函数,问题可能出在解密上。您使用的是哪种排序规则?我认为区分大小写的排序规则会在其后缀中加上“_cs”。 - satnhak
请注意,二进制排序规则与区分大小写的排序规则不同,尽管在这种情况下任何一种都可能给您想要的结果。手册中有一个简略的解释(http://dev.mysql.com/doc/refman/5.5/en/charset-general.html)。 - Michael Mior
3个回答

6

我曾经遇到过同样的问题,我在我的数据库中尝试搜索一个电子邮件地址。在我的member_table表格中有一个用户EMAIL_ADDRESS@GMAIL.COM

SELECT LOWER( AES_DECRYPT( email_address, 'my_key' ) USING 'utf8' )
FROM  `member_table` 
WHERE LOWER( AES_DECRYPT( email_address,  'my_key' ) USING 'utf8' ) LIKE 'EMAIL_ADDRESS@GMAIL.COM'

然而,这并没有起作用,因为它总是以大写形式返回电子邮件地址EMAIL_ADDRESS@GMAIL.COM,即使成员将其电子邮件地址插入为email_address.com,该查询也无法找到它。因此,解决方案是使用CONVERT(AES_DECRYPT(email_address,'my_key'USING'utf8')。这使我能够以不区分大小写的方式查找成员,并且我甚至不需要LOWER函数进行比较。请参见以下示例:
SELECT LOWER( CONVERT( AES_DECRYPT( email_address, 'my_key' ) USING 'utf8' ) )
FROM  `member_table` 
WHERE CONVERT( AES_DECRYPT( email_address,  'my_key' ) USING 'utf8' ) LIKE 'EMaiL_AddreESS@Gmail.CoM'

问题涉及:AES_ENCRYPT()函数使用密钥key_str加密字符串str,并返回包含加密输出的二进制字符串,但这不适用于LOWER函数(如mysql文档中所述:https://dev.mysql.com/doc/refman/5.5/en/encryption-functions.html#function_aes-decrypt)。

1
你确定要在开头放置 %$ 吗? 就像其他人所说的那样,LOWER 应该忽略大小写,所以试试这个:
SELECT * FROM member WHERE AES_DECRYPT(fname,'xxxxxxxxxxxxxxxxx') LIKE 'pooja%';

% 匹配零个或多个任意字符,因此此查询应匹配以下所有内容

pooja
poojaaaa
pooja foo pooja bar

但不是

pooj
pooj a
apooja
 pooja

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接