我使用php mysql将AES加密数据存储在数据库中。我使用AES_ENCRYPT输入的。问题是数据来自iphone,成员的“名字”在UPPER CASE中以第一个字母出现并存储为Upper。对于考试'Pooja'
我想知道当我去搜索以下内容时,它并没有给我任何结果。
SELECT *
FROM member
WHERE LOWER(AES_DECRYPT(fname,'xxxxxxxxxxxxxxxxx')) LIKE'%$pooja%'
当我不使用LOWER时,它给了我'Pooja'。
有人可以在这里纠正我吗?
答案 0 :(得分:5)
我遇到了同样的问题。我试图在我的数据库中搜索电子邮件地址。我的 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 :(得分:0)
您确定要在开头使用%$
吗?
正如其他人所说,LOWER
应该忽略大小写,所以试试这个:
SELECT * FROM member WHERE AES_DECRYPT(fname,'xxxxxxxxxxxxxxxxx') LIKE 'pooja%';
%
匹配零个或多个任意字符,因此此查询应匹配以下所有
pooja
poojaaaa
pooja foo pooja bar
但不是
pooj
pooj a
apooja
pooja
答案 2 :(得分:0)
几分钟前也有这个问题。您是否尝试使用CONVERT(my_decrypted_string USING 'latin1')
转换解密后的字符串?
AES_DECRYPT似乎返回二进制字符串或类似的东西。使用此类型LOWER()不起作用:
http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_lower