#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
работающий в настоящем и проверенный на будущее. Действительно.