mysql - 使用 MySQL 中的加密 blob 字段匹配一行中的所有关键字

标签 mysql select encryption blob

我有一个 MySQL 表,其中文本字段使用 AES_ENCRYPT 存储为 BLOB。我需要将几个关键字与行匹配,条件是所有关键字必须存在于一行中才能返回。虽然在非加密字段上使用 MATCH/AGAINST 效果很好,但我的设置并不走运。

我的“人”表:

+============+===========+
| name_first | name_last |
+============+===========+
| John       | Smith     |
+------------+-----------+
| Jane       | Smith     |
+============+===========+

例如,当搜索“John”和“Smith”时,应该只返回实际包含这两个关键字的行。不应匹配名字为“Jane”和姓氏为“Smith”的行。

唯一似乎有效的选择是在使用 LIKE 时:

SELECT 
AES_DECRYPT(name_first,"MyKey"),
AES_DECRYPT(name_last,"MyKey") 
FROM people 
WHERE (LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%john%" 
OR LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%john%" 
OR LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%smith%" 
OR LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%smith%")

但是,我的 SELECT 返回了 John 和 Jane 的记录。

有什么想法吗?

最佳答案

你有没有试过这样的事情:

SELECT 
  AES_DECRYPT(name_first,"MyKey"),
  AES_DECRYPT(name_last,"MyKey") 
FROM people 
  WHERE (LOWER(CONVERT(AES_DECRYPT(name_first,"MyKey") USING latin1)) LIKE "%john%" 
     AND LOWER(CONVERT(AES_DECRYPT(name_last,"MyKey") USING latin1)) LIKE "%smith%")

关于mysql - 使用 MySQL 中的加密 blob 字段匹配一行中的所有关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15970029/

相关文章:

java - 用于 Yubico OpenPGP 智能卡的 PGP 数据加密

java - 使用 XOR JAVA 解密仅在第一行工作

C 凯撒密码 ASCII 字母换行

php - 我可以使用复选框消除数据库中的最后一行

mysql - 提高 JOIN 查询速度

sql - 'value'关键字在Oracle Select语句中的作用

MySQL 选择查询 : Add 28 days to the last date of a financial quarter

mysql - STR_TO_DATE 不存在

python - 不知道这个 : "pymysql.err.ProgrammingError: (1064..." 发生了什么

python - 如何只选择 SQLAlchemy 中的某些列?