languages language descendente column mysql case-sensitive sql-like

language - Como un caso sensible en MySQL



mysql reserved words as column names (8)

En este método, no tiene que seleccionar el campo buscado:

SELECT table.id FROM table WHERE LOWER(table.aTextField) LIKE LOWER(''%SearchAnything%'')

Tengo una consulta de MySQL:

SELECT concat_ws(title,description) as concatenated HAVING concatenated LIKE ''%SearchTerm%'';

Y mi tabla está codificada utf8_general_ci con MyISAM.

Las búsquedas parecen ser sensibles a mayúsculas y minúsculas.

No puedo averiguar cómo arreglarlo. ¿Qué está mal o cómo lo arreglo?


Este es el código de trabajo:

SELECT title,description FROM ( SELECT title,description, LOWER(CONCAT_WS(title,description)) AS concatenated FROM table1 ) AS Q WHERE concatenated LIKE LOWER(''%search%'')


Este problema está ocurriendo en este caso debido a la intercalación utilizada en la tabla. Has usado utf8_general_ci como colación. Si la intercalación se cambia a utf8_general_ci , las búsquedas no serán sensibles a las mayúsculas. Por lo tanto, una posible solución es cambiar la colación.


Esto funciona también:

SELECT LOWER(DisplayName) as DN FROM Bidders WHERE OrgID=45 HAVING DN like "cbbautos%" LIMIT 10;


Prueba esto:

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated WHERE concatenated LIKE ''%searchterm%''

o (para que veas la diferencia)

SELECT LOWER(CONCAT_WS(title,description)) AS concatenated WHERE concatenated LIKE LOWER(''%SearchTerm%'')


Sólo para completar, en caso de que ayude:

Como se indica en https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html , para los conjuntos de caracteres predeterminados, las comparaciones de cadenas no binarias no distinguen entre mayúsculas y minúsculas de forma predeterminada.

Por lo tanto, una forma fácil de realizar comparaciones que no distingan entre mayúsculas y minúsculas es convertir el campo a tipo CHAR, VARCHAR o TEXT.

Aquí hay un ejemplo con un chequeo contra un solo campo:

SELECT * FROM table1 WHERE CAST(`field1` AS CHAR) LIKE ''%needle%'';


Una solución mucho mejor en términos de rendimiento:

SELECT .... FROM .... WHERE `concatenated` LIKE BINARY ''%SearchTerm%'';

La comparación de cadenas distingue entre mayúsculas y minúsculas cuando cualquiera de los operandos es una cadena binaria.

Otra alternativa es usar COLLATE ,

SELECT .... FROM .... WHERE `concatenated` like ''%SearchTerm%'' COLLATE utf8_bin;


Verifique CHARSET mencionado en el esquema de la tabla:

show create table xyz;

Basado en CHARSET, puedes probar lo siguiente.

select name from xyz where name like ''%Man%'' COLLATE latin1_bin; select name from xyz where name like ''%Man%'' COLLATE utf8_bin;

Los siguientes son los casos que funcionaron para mí, CHARSET = latin1, MySQL versión = 5.6.

mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like ''Promo%'' collate latin1_bin limit 1; +-----------------------+ | installsrc | +-----------------------+ | PromoBalance_SMS,null | +-----------------------+ 1 row in set (0.01 sec) mysql> mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like ''PROMO%'' collate latin1_bin limit 1; +---------------------------+ | installsrc | +---------------------------+ | PROMO_SMS_MISSEDCALL,null | +---------------------------+ 1 row in set (0.00 sec) mysql> select installsrc from appuser where installsrc IS NOT NULL and installsrc like ''PROMO%'' limit 1; +-----------------------+ | installsrc | +-----------------------+ | PromoBalance_SMS,null | +-----------------------+ 1 row in set (0.01 sec)