Как сделать SELECT в PHP / MySQL без учета регистра? - PullRequest
8 голосов
/ 09 мая 2011

Это моя проблема, я думаю, это действительно просто.

Я пытаюсь искать в базе данных, если строка существует. вот мой код:

$req="SELECT * FROM INSTITUTS WHERE inst_name='$fc_inst'";
$result=mysql_query($req) or die ('Erreur :'.mysql_error());
if (mysql_num_rows($result)){
echo '  name exist';
}
else {
echo '  does not exist.';
}

Проблема в том, что когда я ищу "тест", он говорит, что не существует, даже если у меня есть "Тест" в моей базе данных.

Ответы [ 6 ]

11 голосов
/ 09 мая 2011

Попробуйте использовать LIKE вместо =:

$req="SELECT * FROM INSTITUTS WHERE `inst_name` LIKE '$fc_inst'";
9 голосов
/ 09 мая 2011

вы можете использовать LIKE:

WHERE foo LIKE 'bar'

Или вы можете использовать оба нижних регистра:

WHERE LOWER(foo) = LOWER("bar")

Пример с LOWER() наиболее эффективен, если вы знаете, что всеваши данные в базе данных уже находятся в нижнем регистре, и тогда вы можете просто выполнить:

WHERE foo = LOWER("bar")

Это было бы более дешевым сравнением, чем LIKE, если вы можете использовать строчные буквы для всех данных в вашей базе данных.

4 голосов
/ 09 мая 2011

вы можете решить эту проблему, используя «LIKE», как говорили другие люди, НО важно знать, что чувствительность к регистру определяется сличением в базе данных.Например, если вы выбрали сопоставление utf8_general_ci ..., что "ci" в конце означает "без учета регистра", поэтому сравнения, которые вы делаете в будущем, будут без учета регистра.

В нескольких словах:Вы должны быть осторожны с выбранной сортировкой.

4 голосов
/ 09 мая 2011

Это также может быть проблема с настройкой COLLATE вашей таблицы

Этот оператор CREATE заставит ваши запросы select быть чувствительными к регистру даже при использовании операторов LIKE:

CREATE
  table instituts (inst_name VARCHAR(64))
  CHARACTER SET latin1 COLLATE latin1_general_cs;

Принимая во внимание, что этот будет гарантировать регистронезависимость:

CREATE
  table instituts (inst_name VARCHAR(64))
  CHARACTER SET latin1
3 голосов
/ 05 августа 2011

Вы можете использовать сравнение MD5 (), если хотите, чтобы чувствительно к регистру выберите:

$req="SELECT * FROM INSTITUTS WHERE MD5(inst_name)=MD5('$fc_inst')";

Конечно, вы потребляете немного ресурсов сервера, но это гораздо проще, чем эти скучные сопоставления.

0 голосов
/ 09 мая 2011

Попробуйте:

$req="SELECT * FROM INSTITUTS WHERE UCASE(inst_name)=UCASE('$fc_inst')";
$result=mysql_query($req) or die ('Erreur :'.mysql_error());
if (mysql_num_rows($result)){
echo '  name exist';
}
else {
echo '  does not exist.';
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...