2011-12-27 18 views
17

¿Hay alguna forma de hacer que las consultas de búsqueda sean insensibles a los acentos?Pregunta de búsqueda insensible a los acentos en MySQL

la colación de la columna y la tabla son utf8_polish_ci y no quiero cambiarlas.

ejemplo palabra: toruń

select * from pages where title like '%torun%' 

No se encuentra "toruń". ¿Cómo puedo hacer eso?

+1

http://stackoverflow.com/questions/2302813/normalizing-accented-characters-in-mysql-queries – Sun

+0

@SunWKim Lo intenté antes pero no funcionó para mí. – ocanal

+0

@ocanal ¿Encontraste una solución que puedes compartir con nosotros? – zvzej

Respuesta

17

Puede cambiar la intercalación en tiempo de ejecución en la consulta SQL,

...where title like '%torun%' collate utf8_general_ci 

pero ten en cuenta que el cambio de la colación sobre la marcha en tiempo de ejecución renuncia a la posibilidad de MySQL usando un índice, por lo que el rendimiento en tablas de gran tamaño puede ser terrible.

O bien, puede copiar la columna en otra columna, como searchable_title, pero cambie la intercalación en ella. En realidad, es común hacer este tipo de cosas, donde se copian los datos pero se presentan en una forma ligeramente diferente que está optimizada para una carga de trabajo/propósito específico. Puede utilizar activadores como una buena forma de mantener sincronizadas las columnas duplicadas. Este método tiene el potencial de funcionar bien, si está indexado.

Nota - Asegúrese de que su db realmente tenga esos caracteres y no entidades html. Además, el conjunto de caracteres de su conexión es importante. El anterior se supone que está establecido en UTF-8, por ejemplo, a través de set names como set names utf8

Si no es así, se necesita un introducer para el valor literal

...where title like _utf8'%torun%' collate utf8_general_ci 

y, por supuesto, el valor de las comillas simples debe ser realidad utf8 codificado, incluso si el resto de la consulta SQL no.

+1

¿Tiene alguna idea de por qué no funciona para Ł (pulir L con acento similar en la ciudad Łódź)? '... donde city like _utf8 '% lodz%' recopila utf8_general_ci' – suz

4

Esto no funcionará en circunstancias extremas, pero intente cambiar la intercalación de columnas a UFT8 utf8_unicode_ci. Entonces los caracteres acentuados serán iguales a sus contrapartes sin acentos.

Cuestiones relacionadas