MySQL — использование оператора LIKE с функцией UNHEX()

#php #mysql

#php #mysql

Вопрос:

Я пытаюсь использовать функцию MySQL UNHEX() с оператором LIKE, но я не могу получить ожидаемый результат as $result_2_expected .

Что я делаю не так?
Я пробую способы, описанные ниже, все безуспешно:

  • КАК UNHEX(‘B72756365%’)
  • НАПРИМЕР, ‘%UNHEX(‘4272756365′)%’
  • НАПРИМЕР, ‘%UNHEX(4272756365)%’

Опыт работы с оператором Equal (успех):

 $name_1 = bin2hex("Bruce Wayne"); //4272756365205761796e65
$query_1 = "SELECT `NAME` FROM `USERS_TABLE` WHERE `NAME` = UNHEX('{$name_1}')"; // UNHEX('4272756365205761796e65')


$result_1 = [0][NAME] => "Bruce Wayne"; // Success
 

Опыт работы с оператором LIKE (сбой):

 $name_2 = bin2hex("Bruce"); // 4272756365
$query_2 = "SELECT `NAME` FROM `USERS_TABLE` WHERE `NAME` LIKE UNHEX('%{$name_2}%')"; // UNHEX('B72756365%')

$result_2 = [] => null; // Fail

$result_2_expected = [0][NAME] => "Bruce Wayne"; [1][NAME] => "Bruce Willis"; [2][NAME] => "Bruce Springsteen"; // Expected as Success

 

Комментарии:

1. Замените знаки процента их шестнадцатеричным представлением.

2. Работает хорошо. Спасибо

Ответ №1:

Ваша проблема в том, что вы ввели подстановочные знаки в вызов UNHEX вместо того, чтобы объединять их вне его, и это приводит UNHEX к возврату NULL , который всегда будет вызывать LIKE возврат false .

Изменить

 LIKE UNHEX('%{$name_2}%')
 

Для

 LIKE  CONCAT('%', UNHEX('{$name_2}'), '%')
 

и ваш код будет работать так, как ожидалось. В качестве альтернативы, вы могли бы поступить так, как предложил @Akina в комментариях, и заменить % знаки в вызове на UNHEX их шестнадцатеричное представление ( 25 ) и заменить ваш код на

 LIKE UNHEX('25{$name_2}25')
 

Комментарии:

1. Работает с обоими решениями. Спасибо