我需要使用不区分大小写的电子邮件ID登录。我的邮件ID以加密格式存储,我通过以下查询从数据库中获取:
$this->db->select('Name');
$this->db->from('users');
$this->db->where('emailId',"AES_ENCRYPT('{$emailId}','/*awshp$*/') ", FALSE);
$query = $this->db->get();
$result = $query->row();
return $result;
我使用二进制,但不使用
它有简单的逻辑,当您注册时,将电子邮件id的哈希值转换为小写后存储。登录时还将其转换为lowercase.so如果用户在任何情况下输入电子邮件id,则加密字符串匹配。
AES加密是一种双向算法,这意味着您可以恢复原始值,因此您还可以更新不符合要测试的格式的现有记录。
在数据库中运行更新后,只需应用Tim Biegeleisen提出的建议,就可以开始了。
更新现有记录的演示
mysql> CREATE TABLE t1 (
-> email VARBINARY(256)
-> );
Query OK, 0 rows affected (0.31 sec)
mysql> INSERT INTO t1 (email) VALUES
-> (AES_ENCRYPT('MiXeDcAsEdEmAiL@gmail.com','salt')),
-> (AES_ENCRYPT('UPPERCASEDEMAIL@gmail.com','salt')),
-> (AES_ENCRYPT('lowercasedemail@gmail.com','salt'));
Query OK, 3 rows affected (0.09 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> UPDATE t1 SET email = AES_ENCRYPT(LOWER(CAST(AES_DECRYPT(email,'salt') AS CHARACTER)),'salt');
Query OK, 2 rows affected (0.11 sec)
Rows matched: 3 Changed: 2 Warnings: 0
mysql> SELECT CAST(aes_decrypt(email,'salt') AS CHARACTER) lower_cased from t1;
+---------------------------+
| lower_cased |
+---------------------------+
| mixedcasedemail@gmail.com |
| uppercasedemail@gmail.com |
| lowercasedemail@gmail.com |
+---------------------------+
3 rows in set (0.00 sec)
NB不要忘记更改update语句以匹配您的列名和用作salt的值。