Якщо Ви вже давно працюєте з ПО MySQL. то звернули увагу, що будь-яка вибірка, або пошук йде без урахування регістру. У більшості випадків, це зручно, проте, іноді все-таки буває потрібно зробити до регістру пошук для MySQL. Ось про це я сьогодні і напишу.
Щоб стало зрозуміло, про що йде мова, давайте відразу наведу приклад SQL-запиту:
SELECT * FROM `users` WHERE` login` = 'admin'
Даний запит поверне користувача з логіном "admin". Однак, все не зовсім не так. Якщо буде користувач "Admin" (або, наприклад, "AdMiNM"), то він також буде результуючим.
На практиці такий помилки не буде. Якщо Ви все правильно зробили (хоча б поставили UNIQUE на відповідне поле), то такі значення як "admin" і "Admin" ніколи разом не будуть. Тому в даному випадку, чутливі до регістру вибірка зовсім не потрібна.
SELECT * FROM `users` WHERE` login` = 'admin' AND `password` = 'mypassword'
Так як регістр за умовчанням не враховується, отже, такий користувач буде знайдений і пароль співпаде, чого бути не повинно, тому що якщо регістр логіна не важливий, то ось регістр пароля обов'язково треба враховувати.
Проблема вирішується за допомогою BINARY. Якщо вказати даний оператор в запиті, то наступні за ним рядки будуть чутливі до регістру. Це працює з наступних причин: всі подальші рядки після BINARY будуть переведені в двійковий код. А код для верхнього і нижнього регістра різниться. Отже, операція порівняння, якщо рядки не збігаються з точністю до регістру, поверне false. оскільки їх двійковий код різний. Для нашого з Вами прикладу ось цей запит буде вірним:
SELECT * FROM `users` WHERE` login` = 'admin' AND BINARY `password` = 'mypassword'
Ось таким нескладним способом робиться чутливі до регістру пошук і вибірка для MySQL.