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)