Регистрозависимый поиск для MySQL
Если Вы уже давно работаете с ПО MySQL, то обратили внимание, что любая выборка, либо поиск идёт без учёта регистра. В большинстве случаев, это удобно, однако, иногда всё-таки бывает нужно сделать регистрозависимый поиск для MySQL. Вот об этом я сегодня и напишу.
Чтобы стало понятно, о чём идёт речь, давайте сразу приведу пример SQL-запроса:
SELECT * FROM `users` WHERE `login`='admin'
Данный запрос вернёт пользователя с логином "admin". Однако, всё не совсем не так. Если будет пользователь "Admin" (или, например, "AdMiNM"), то он также будет результирующим.
На практике такой ошибки не будет. Если Вы всё правильно сделали (хотя бы поставили UNIQUE на соответсвующее поле), то такие значения как "admin" и "Admin" никогда вместе не будут. Поэтому в данном случае, регистрозависимая выборка вовсе не нужна.
А вот разберём другой пример. Допустим, у Вас в базе хранятся открытые пароли (это очень плохо, но допустим), и Вы хотите провести авторизацию пользователя. Предположим, что у пользователя "admin" пароль "myPassWord". Однако, пользователь вводит такой пароль: "mypassword". В результате получится такой SQL-запрос:
SELECT * FROM `users` WHERE `login`='admin' AND `password`='mypassword'
Так как регистр по умолчанию не учитывается, следовательно, такой пользователь будет найден и пароль совпадёт, чего быть не должно, так как если регистр логина не важен, то вот регистр пароля обязательно надо учитывать.
Проблема решается с помощью BINARY. Если указать данный оператор в запросе, то следующие за ним строки будут регистрозависимые. Это работает по следующей причине: все дальнейшие строки после BINARY будут переведены в двоичный код. А код для верхнего и нижнего регистра различается. Следовательно, операция сравнения, если строки не совпадают с точностью до регистра, вернёт false, поскольку их двоичный код различен. Для нашего с Вами примера вот этот запрос будет верным:
SELECT * FROM `users` WHERE `login`='admin' AND BINARY `password`='mypassword'
Вот теперь, если пароль будет введён без учёта регистра, то будет ошибка авторизации. Как можно увидеть, BINARY стоит перед паролем, следовательно, в логине регистр учитываться не будет, а в пароле регистр будет учтён. Именно так и должно быть.
Вот таким несложным способом делается регистрозависимые поиск и выборка для MySQL.
-
- Михаил Русаков
Комментарии (3):
Написал небольшую проверку регистрозависимой выборки... проверка логина и пароля пользователя) Это на память как пример моей первой работы с БД) Код формы: <form id="form1" name="form1" method="post" action="index.php"> <p> <label> <input type="text" name="login" id="login" /> </label> </p> <p> <input type="password" name="pass" id="pass" /> </p> <p> <input type="submit" name="submit" id="submit" value="Отправить" /> </p> </form> Код php: <?php $mysqli = @new mysqli('localhost', 'user', 'user', 'bd'); //подключение к таблице if (mysqli_connect_errno()) { echo "Подключение невозможно: ".mysqli_connect_error(); } else { echo "Подключение успешно выполнено. "; // $mysqli->query("INSERT INTO `bd`.`bd_test` (`Field1`, `Field2`, `Field3`, `Field4`) VALUES ('555', '', '', '')"); } $result_set = $mysqli->query("SELECT * FROM `users` WHERE `login`='".$_POST[login]."' AND BINARY `password`='".$_POST[pass]."'"); $result_set->num_rows; echo "<br />"; while ($row = $result_set->fetch_assoc()) { echo "Добро пожаловать, "; echo $row[login]; echo "<br />"; echo "Ваш пароль: "; echo $row[password]; echo "<br />"; } echo "<br />"; $result_set->close(); $mysqli->close(); ?>
Ответить
В md5() шифрованные пароли 'password' и 'PassWord' не будет одинаковой да?
Ответить
Самый лучший способ ответа на такие вопросы - самостоятельно проверить. Вы, во-первых, справитесь сами, а, во-вторых, лучше запомните. Проверить это - дело максимум одной минуты.
Ответить
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.