2013-11-26 5 views
0

В моей базе данных У меня есть запись на varchar: zZzMysql - Прописные буквы в строках

Обратите внимание на столицу.

Я разрешаю использовать ввод имени пользователя и проверку с помощью записи. Но я пытаюсь сделать это неправильно, нечаянно записывая имя пользователя zzz - заметьте все строчные буквы.

Mysql говорит, что все нормально, и оно возвращает true, когда я ожидаю, что он вернет false. Что я делаю не так. Вот моя функция ($ дб является действительным дескриптор базы данных):

function IsUsername($db, $Username) 
{ 
    $stmtIsUsername = $db->prepare("SELECT Username FROM members WHERE " 
       . "Username = :Username"); 
    $stmtIsUsername->execute(array(':Username' => $Username)); 
    $ret = ($stmtIsUsername && isset($stmtIsUsername) && $stmtIsUsername->rowCount() > 0) ? true : false; 
    $stmtIsUsername->closeCursor(); // mysql_free_result equivalent 
    return $ret; 
} 

В моей Имя базы данных = ZZZ

Я зову следующее ($ дб действует)

$userInput = $_GET['username']; // Which is "zzz" 
if(IsUsername($db, $userInput)) 
{ 
    echo "All is OK"; 
} else 
{ 
    echo "The user is not valid"; 
} 

эхо раздражает «Все в порядке». Что я делаю не так?

+0

Дубликат: http://stackoverflow.com/questions/3936967/mysql-case- нечувствительный-select –

+0

Его не дубликат. Я хочу, чтобы zZz и zzz были разными. Ваша ссылка хочет, чтобы оба были одинаковыми. – Rewind

ответ

1

Набор символов по умолчанию и сортировка по умолчанию - latin1 и latin1_swedish_ci, поэтому неважные сравнения строк по умолчанию нечувствительны к регистру. Это означает, что при поиске с col_name LIKE 'a%' вы получаете все значения столбцов, начинающиеся с A или a. Чтобы сделать этот регистр чувствительным, убедитесь, что один из операндов имеет чувствительную к регистру или двоичную сортировку. Например, если вы сравниваете столбец и строку, у которых есть набор символов latin1, вы можете использовать оператор COLLATE, чтобы заставить либо операнд иметь сортировку latin1_general_cs, либо latin1_bin:

col_name COLLATE latin1_general_cs LIKE 'a%' col_name LIKE «A%» КОПИЙ latin1_general_cs col_name КОПИЙ latin1_bin LIKE «A%» col_name LIKE «A%» СОРТ latin1_bin Если вы хотите столбец всегда быть судимым в случае чувствительных к моде, объявит его с учетом регистра или двоичная сортировка. См. Раздел 13.1.10, «Синтаксис CREATE TABLE».

[http://dev.mysql.com/doc/refman/5.0/en/case-sensitivity.html]

+0

Это звучит как ответ, но я программист по хобби и не понял ни слова. Что мне делать в моем коде? Просто посмотрел ссылку. Чтение сейчас – Rewind

+0

Итак, я прочитал ссылку и могу проверить свой код mysql, который должен измениться на: $ stmtIsUsername = $ db-> prepare ("SELECT Username FROM members WHERE Имя пользователя COLLATE Latin1_General_CS_AS =: Username"); Правильно ли я прочитал. И это делает поиск медленнее? – Rewind

+0

Перечитайте ссылку - ее стол, который вы говорите мне, чтобы меняться. Он работает сейчас. Благодарю. – Rewind