fabricawebs
Blog donde podrás encontrar el árticulo o tutorial que estas buscando sobre PHP, JavaScript, XML, Flash, Ruby on Rails, o desarrollo web en general.

Las ñ y los acentos en busquedas de mysql

Category: , By Carlos
Recientemente tuve que revisar el comportamiento extraño que tenía un script que utilizaba para buscar libros en una base de datos, cuando realizaba una busqueda de libros cuyo título contuviese la cadena "eñe" el número de libros encontrados era muy superior al esperado. Tras revisar los títulos ví que el problema era que la consulta devolvía todos los libros cuyo título contenía "eñe" y además todos los que contenían "ene". Por lo visto el campo título en la BD tenía asignado el conjunto de caracteres por defecto "latin1" por lo que el caracter eñe era reconocido pero el "collation" por defecto latin1_swedish_c1 asigna a los caracteres ñ y n el mismo valor.

El conjunto de caracteres y la colación son cosas relacionadas pero distintas, de ahí la importacia de comprender correctamente la propiedad collation. Según la documentación online de Mysql 5.0 : Una colación es un conjunto de reglas para comparar caracteres en un conjunto de caracteres..

Finalmente y ya que no podía modificar la estructura de la BD la solución fue añadir explícitamente una colación para esa comparación:

p.nombre like '%eñe%' COLLATE latin1_spanish_ci


Una curiosidad a la hora de asignar los collation en la estructura de BD es que se puede asignar collations a distintos niveles, es decir, la base de datos tiene asignado un collation y este es heredado por sus tablas si estas no especifican uno explicitamente. Lo mismo pasa con los campos de las tablas, los cuales heredan el collation de la tabla a la que pertenecen si no se les declara uno específico para ellos.

De este modo lo ideal sería tener nuestra base de datos creada con el collation especifico del idioma en cual creamos la aplicación y luego en los campos en que guardamos texto en otros idiomas especificar ese explícitamente esos idiomas.
 

0 comments so far.

Something to say?