нет, все нормально, просто вдумайтесь - в базе хранится Sart, LOWER(username) начинает искать по полю username, предварительно переводя его для себя (только для того чтобы произвести выборку, при этом ничего не изменяя в самой записи.) в нижний регистр, и сравнивает с strtolower($this->username), который также в нижнем регистре. Так что никакой разницы нет, как вы храните запись в базе, LOWER() сам все сделает.
Неправда. Всё зависит от типа сравнения, указанного для поля username. Если оно оканчивается на _ci (cp1251_general_ci), то можете искать хоть SART, хоть sArT, все равно запись Sart будет найдена. И я думаю, что в данном случае нужно не утруждать субд переводом каждого нейма в ловеркейз, а использовать корректный тип сравнения.
CREATE TABLE tbl_user
(
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
username VARCHAR(128) NOT NULL,
password VARCHAR(128) NOT NULL,
salt VARCHAR(128) NOT NULL,
email VARCHAR(128) NOT NULL,
profile TEXT
);
Символьная переменная, это все что для нее задано. Что там по умолчанию, не знаю, но думаю
сравнение на простое совпадение-это очень естественно задать по умолчанию.
В общем, с этим find(‘LOWER(username)=?’,array(0=>$username)) ситуация, как я вижу, зашла в тупик.
Sart, всё достаточно прозрачно тут и всё понятно, ни каких заморочек нет. при запросе:
find('LOWER(username)=?',array($username))
переменную $username вы тоже должны обязательно перевести в нижний регистр strtolower($username)
При регистрации также нужно делать сверку в нижнем регистре. Тогда не получится кучу разных пользователей с таким вот логинами: Sart, SarT, sArt и т.п.
Вы ведь не хотите чтобы разные пользователи имели один и тот же ник, но с разным регистром.