2011-05-09 11 views
6

Ella es mi problema, supongo que es realmente básico.¿Cómo hacer que SELECCIONAR en PHP/MySQL sea insensible?

Estoy tratando de buscar en la base de datos si existe una línea. aquí está mi código:

$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.'; 
} 

Probleme es, cuando imm en busca de "prueba", se dice que no existe, aunque tenga "Prueba" en mi base de datos.

+2

Las consultas de MySQL no distinguen entre mayúsculas y minúsculas por defecto, a menos que las tablas subyacentes tengan un conjunto de intercalaciones sensible a mayúsculas y minúsculas. –

Respuesta

9

puede utilizar LIKE:

WHERE foo LIKE 'bar' 

O puede emitir tanto en minúsculas con:

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

El ejemplo con LOWER() es más efectiva cuando usted sabe que todos sus datos en la base de datos ya está entubado inferior y luego sólo se puede ejecutar:

WHERE foo = LOWER("bar") 

Esta sería una comparación más barato que el LIKE si puede minúsculas todos los datos en su base de datos.

+1

estoy seguro de que en algunas áreas, algo de información ** tiene que ** ser en mayúsculas o caso mixto y no puede ser todo en minúsculas – Neal

10

Trate de usar LIKE en lugar de =:

$req="SELECT * FROM INSTITUTS WHERE `inst_name` LIKE '$fc_inst'"; 
+0

¿Esto funcionará ?, ¿no debería usar Lower() en statement y strtolower() en código PHP? –

+0

@Vash, ¿es esa una pregunta o una declaración? – Neal

+0

Esa debería ser la pregunta. –

0

Probar:

$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.'; 
} 
+0

Gracias a todos. Aprecio –

4

También podría haber un problema con la configuración de

INTERCALAR mesa Esta sentencia CREATE obligará a sus consultas de selección para ser sensible a mayúsculas incluso cuando utilizando como operadores:

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

mientras que éste se asegurará caso Insensibilidad:

CREATE 
    table instituts (inst_name VARCHAR(64)) 
    CHARACTER SET latin1 
+1

Esta es posiblemente la respuesta más sensata. –

3

se puede resolver utilizando "similares" como otras personas que dijeron, pero se es importante saber que la sensibilidad de caso está determinada por la intercalación en la base de datos. Por ejemplo, si selecciona una intercalación utf8_general_ci ... esa "ci" al final significa "insensible a mayúsculas y minúsculas", por lo que las comparaciones que haga en el futuro no serán sensibles a mayúsculas y minúsculas.

En pocas palabras: debe tener cuidado con la intercalación que seleccione.

3

Se puede utilizar una comparación MD5() si quieres un mayúsculas y minúsculas seleccione:

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

por supuesto que consumen un poco de CPU del servidor pero es bastante más simple que las colaciones aburrido.

+0

* "un poco de la CPU del servidor" * puede significar unas horas de CPU si la tabla es grande y la consulta se ejecuta con frecuencia. –

+0

;-) sí, por supuesto! –

+0

buena idea md5 ... grats y muchas gracias – KingRider

Cuestiones relacionadas