我有一个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记录。
有什么想法吗?
答案 0 :(得分: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%")
答案 1 :(得分:0)
经过相当长的一段时间和研究后,我发现解决我问题的唯一方法是创建一个临时MySQL(仅在PHP脚本执行期间存在),用加密表中的非加密数据提供它,然后执行MATCH /反对。由于桌子很大,搜索速度很慢,但你能做什么呢?