Оператор MySQL IF не работает, если ввод условия ДВОИЧНЫЙ

#mysql

#mysql

Вопрос:

У меня есть хранимая процедура в следующих строках:

 CREATE DEFINER=`username`@`localhost` PROCEDURE `UserUpdate`(IN inUserId INT, IN inUserFname VARCHAR(40), IN inUserLname VARCHAR(40), IN inUserEmail VARCHAR(40), IN inUserPhone VARCHAR(40), IN inUserPassword BINARY(60))
BEGIN
    IF inUserPassword='' THEN
        UPDATE `users`
        SET fname=inUserFname, lname=inUserLname, email=inUserEmail, phone=inUserPhone, datemodified=NOW()
        WHERE id=inUserId;
    ELSE
        UPDATE `users`
        SET fname=inUserFname, lname=inUserLname, email=inUserEmail, phone=inUserPhone, password=inUserPassword, datemodified=NOW()
        WHERE id=inUserId;
    END IF;
END
  

Информация поступает из HTML-формы / PHP-скрипта. Если пользователь не обновил свой пароль, то inUserPassword остается пустым, и IF часть процедуры должна выполняться. Если пользователь обновил свой пароль в форме, тогда ELSE часть должна выполняться.

Пароль хранится как хэш bcrypt, а столбец в базе данных задается как ДВОИЧНЫЙ (60).

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу запустить IF , если ДВОИЧНЫЙ файл используется для пароля. Если я изменю столбец пароля на VARCHAR, приведенный выше запрос будет работать просто отлично. Я понимаю, что двоичное значение не совпадает со значением ASCII или Unicode, но ни для чего, как в приведенном выше коде, разве оно не должно быть одинаковым?

Как мне это исправить? Спасибо за любую помощь.

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

1. можете ли вы просто преобразовать оба в двоичный файл? ЕСЛИ двоичный (inUserPassword)= двоичный («), ТО

2. Укажите сопоставление для пустой строки явно, как IF inUserPassword = '' COLLATE 'utf8mb4_bin' THEN (укажите правильное сопоставление).

3. Спасибо. К сожалению, ни одно из этих изменений не меняет поведение.

4. Как бы то ни было, хэши паролей из php обычно хранятся в таблицах как VARCHAR(255) , а не BINARY как данные. Проверка пароля принимает эти строки, а не двоичные. Рассмотрите возможность изменения вашего типа данных.

5. Этот материал действительно древний. По мере того, как проходит время и киберпреступники становятся умнее, хэши паролей становятся длиннее, вы хотите, чтобы ваш столбец хэша пароля был объявлен как password VARCHAR(255) CHARACTER SET ascii работающий в настоящем и проверенный на будущее. Действительно.