mysql search non-ascii-characters

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 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)