mysql - Cómo filtrar una columna con caracteres sin acento usando la consulta de selección
search non-ascii-characters (5)
El uso de RLIKE (REGEXP) podría resolver su problema (devolverá el resultado esperado al usar una versión más potente de Me gusta)
de la documentación MYSQL:
Una expresión regular es una forma poderosa de especificar un patrón para una búsqueda compleja.
.... REGEXP no distingue entre mayúsculas y minúsculas, excepto cuando se utiliza con cadenas binarias.
solo reemplaza
where name like ''%aa%''
con
where Name rlike ''aa'';
para hacer una búsqueda insensible a mayúsculas y minúsculas de la expresión ''aa''.
PERO
Este puede ser un enfoque poco seguro ya que se pueden producir resultados inesperados al comparar caracteres de múltiples bytes según la documentación de MySQL.
Tengo una tabla de MySQL (prueba) con codificación de juego de caracteres utf-8. Hay tres entradas, dos entradas con caracteres normales y otro nombre con caracteres de acento.
CREATE TABLE test (
id Integer,
name VARCHAR(50),
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
INSERT INTO `test` (`id`, `name`) VALUES (1, ''aaaa'');
INSERT INTO `test` (`id`, `name`) VALUES (2, ''AAAA'');
INSERT INTO `test` (`id`, `name`) VALUES (3, ''áááá'');
Si ejecuto la siguiente consulta de selección, devuelve todas las 3 entradas
Resultado actual:-
select * from test where name like ''%aa%'';
id | name
----|----
1 | aaaa
2 | AAAA
3 | áááá
En lugar de eso, se debe devolver la última entrada con id = 3.
No quiero usar ''BINARY'' O ''COLLATE utf8_bin'' porque solo devuelve la búsqueda de mayúsculas y minúsculas.
Necesito una búsqueda normal con una cadena como consulta, por ejemplo:
Resultado Esperado:-
select * from test where name like ''%aa%'';
id | name
---|-----
1 | aaaa
2 | AAAA
La combinación de utf8_bin es lo que necesita para su requerimiento de manejar acentos
No quiero usar ''BINARY'' O ''COLLATE utf8_bin'' porque solo devuelve la búsqueda de mayúsculas y minúsculas.
Esto es más fácil (y más eficaz) de resolver con utf8_bin que resolver el problema del acento con otra intercalación
SELECT * FROM test WHERE LOWER(name) like ''%aa%'' COLLATE utf8_bin
-> añadido después de los comentarios
La consulta anterior asume que los parámetros de consulta son minúsculos, pero si no puede modificar los parámetros para que siempre sean minúsculos, también puede usar esta variación.
SELECT * FROM test WHERE LOWER(name) like LOWER(''%ÚÙ%'') COLLATE utf8_bin
Puedes probar con:
SELECT * FROM test.test
where convert(name using ascii) like ''%aa%'';
Pero tenga cuidado, la conversión tiene problemas de rendimiento en los índices. Más información en http://dev.mysql.com/doc/refman/5.7/en/mysql-indexes.html
Puedes resolver tu problema usando la siguiente consulta
select * from token where (convert(name using ASCII)) like ''%aa%''
convert
se utiliza para convertir entre conjuntos de caracteres
utf8_bin
es la intercalación que desea distinguir entre caracteres acentuados.
En la consulta, el usuario puede lower
para hacer que la consulta sea insensible.
CREATE TABLE `token` (
`id` int(11) NOT NULL DEFAULT ''0'',
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
mysql> select * from token where lower(name) like ''%aa%'';
+----+------+
| id | name |
+----+------+
| 1 | aaaa |
| 2 | AAAA |
+----+------+
2 rows in set (0.00 sec)