2010-09-16 26 views
5

Im utilizando la siguiente PHP y MySQL para recuperar filas de una tabla,PHP/MySQL Búsqueda - Caso sensible

$search_word=$_GET['search_word']; 
$search_word_new=mysql_escape_string($search_word); 
$search_word_fix=str_replace(" ","%",$search_word_new); 
$sql=mysql_query("SELECT * FROM tweets WHERE content LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20"); 

El campo 'contenido' es un campo de texto que contiene los tweets.

El problema que tengo es si la búsqueda 'S tackoverflow' consigo todos los resultados con 'Stackoverflow' pero no hay resultados cuando el texto es 's tackoverflow'. Básicamente la búsqueda es sensible a mayúsculas y minúsculas.

¿Es posible cambiar la consulta o PHP, por lo que al buscar 'Stackoverflow' se devuelven los resultados en mayúscula y minúscula?

Respuesta

4

que puede probar:

$search_word_fix=strtolower(str_replace(" ","%",$search_word_new)); 
$sql=mysql_query("SELECT * FROM tweets WHERE lower(content) LIKE '%$search_word_fix%' ORDER BY votes DESC LIMIT 20"); 
  • He agregado strtolower para hacer $search_word_fix todas las minúsculas.
  • Y en la cláusula where he cambiado content a lower(content) modo que comparo con minúsculas de content.

Puede haber hecho estos dos cambios en la consulta como se sugiere en otra respuesta.

+0

La solución más simple para mí como novato de PHP. – CLiown

+1

Simplest! = Mejor. Esto no aprovechará ningún posible índice, y es bastante probable que sea más lento. (dijo el pomposo idiota que en realidad estaba solo entristecido por el hecho de que a nadie parece importarle la intercalación insensible a mayúsculas y minúsculas en MySQL). – Wrikken

3

obligar a los casos tanto del término de búsqueda y el valor de columna:

SELECT * FROM tweets WHERE LOWER(content) LIKE LOWER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20 

o:

SELECT * FROM tweets WHERE UPPER(content) LIKE UPPER('%$search_word_fix%') ORDER BY votes DESC LIMIT 20 

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html

3

La forma 'adecuada' de hacerlo es establecer que el cotejo entre mayúsculas y minúsculas:

CREATE TABLE foo (col1 varchar(24) COLLATE utf8_bin,col2 varchar(24) COLLATE utf8_general_ci); 
Query OK, 0 rows affected (0.03 sec) 

DB 5.1.49-1-log:test mysql> INSERT INTO foo VALUES ('stackoverflow','stackoverflow'); 
Query OK, 1 row affected (0.01 sec) 

DB 5.1.49-1-log:test mysql> SELECT * FROM foo WHERE col1 LIKE 'Stackoverflow'; 
Empty set (0.00 sec) 

DB 5.1.49-1-log:test mysql> SELECT * FROM foo WHERE col2 LIKE 'Stackoverflow'; 
+---------------+---------------+ 
| col1   | col2   | 
+---------------+---------------+ 
| stackoverflow | stackoverflow | 
+---------------+---------------+ 
1 row in set (0.00 sec) 

DB 5.1.49-1-log:test mysql> SELECT * FROM foo WHERE col1 COLLATE utf8_general_ci LIKE 'Stackoverflow'; 
+---------------+---------------+ 
| col1   | col2   | 
+---------------+---------------+ 
| stackoverflow | stackoverflow | 
+---------------+---------------+ 
1 row in set (0.00 sec) 
+1

No use la cláusula 'COLLATE' a menos que simplemente no pueda cambiar la clasificación de la columna. No puede usar el índice. –

0

mysql> SELECT * FROM myDb.myTable WHERE nombre = 'test980'; 1 fila en el conjunto (0,00 segundos)

mysql> SELECCIONAR * FROM myDb.myTable WHERE username = 'TEST980'; Conjunto vacío (0,00 seg.)

Las columnas MySQL pueden crearse con la palabra clave binaria. Sospecho que este es tu problema. Puede modificar la columna para que no sea binaria o cambiar su consulta a:

SELECCIONAR * FROM myDb.myTable WHERE UCASE (username) = 'TEST980';

que hace que las comparaciones de cadenas sean insensibles a las mayúsculas y minúsculas a pesar del conjunto de caracteres binarios elegido.

+0

'BINARY' y' UCASE' son costosos porque no se puede usar el índice. –

0

Todo se trata de elegir la mejor intercalación al crear la base de datos MySql.

  • utf8_unicode_ci es útil si desea ordenar por ejemplo el juego de caracteres alemán con precisión, pero es lento.
  • utf8_general_ci es por defecto el estándar cuando se crea un carácter de base de datos MySQL que establece utf8 y es el más rápido, pero no distingue entre mayúsculas y minúsculas.
  • Regla de oro: utilice siempre utf8_general_ci en MySQL y coteje utf8_bin si se requiere mayúsculas o utilice SELECT BINARY en su extracto.
1

Cambiar la COLLATION de la columna en cuestión (content) para ser sensible a mayúsculas, como utf8mb4_unicode_ci.

Doing the case folding en PHP es costoso e ineficiente.

Cuestiones relacionadas