AES_ENCRYPT を使用して、テキスト フィールドが BLOB として格納される MySQL テーブルがあります。行に対していくつかのキーワードを照合する必要があります。返されるには、すべてのキーワードが行に存在する必要があります。これは、暗号化されていないフィールドで 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 の両方のレコードを返します。
何か案は?