1

我有一个 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 记录。

有任何想法吗?

4

2 回答 2

0

您是否尝试过类似的方法:

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%")
于 2013-04-12T11:48:58.987 回答
0

经过一段时间的研究,我发现我的问题的唯一解决方案是创建一个临时 MySQL(仅在执行 PHP 脚本期间存在),从我的加密表中提供非加密数据,然后执行 MATCH/AGAINST . 由于表很大,因此搜索速度非常慢,但是您能做什么?

于 2013-05-02T21:59:28.063 回答