Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: nhaalclkiemr en 11 Octubre 2011, 22:29 pm



Título: [MySQL] Problema con Unicode (UTF-8)
Publicado por: nhaalclkiemr en 11 Octubre 2011, 22:29 pm
Hola. Vereis, tengo una base de datos local MySQL. La tengo codificada en UTF-8, y para acceder a ella utilizo Java, el cual tambien lo tengo configurado para que utilice UTF-8. Utilizo InnoDB.

En principio me escribe y recupera datos de la base de datos correctamente, incluso escribe los carácteres especiales. El problema es que a la hora de comparar detecta algunos carácteres que no son como iguales, normalmente los carácteres con tildes. Por ejemplo, si tengo esta tabla llamada table1:

NombreEdad
Mânolö
20
Manolo
40
Pepe
10

Si hago:

Código:
SELECT * FROM `table1` WHERE (Mânolö LIKE `Nombre`);

me debería devolver unicamente:

NombreEdad
Mânolö
20

Sin embargo, me devuelve esto:

NombreEdad
Mânolö
20
Manolo
40


En resumen, a la hora de comparar (por ejemplo con un SELECT) toma por igual carácteres diferentes, por ejemplo a,á,à,â,ä los toma por iguales.

Bueno el problema no son las consultas, sino insertar nuevos datos, ya que si inserto dos filas con clave primaria diferente en esos carácteres me la detecta como duplicado.

Por ejemplo, imaginemos que en la primera tabla la columna Nombre es la clave primaria. Para insertar una nueva fila Pepê, 80 sería así:

Código:
INSERT INTO `table1` (`Nombre`, `Edad`) VALUES ('Pepê', 80);

Sin embargo me devuelve un error:

Código:
ERROR 1062: Duplicate entry 'Pepê' for key 'PRIMARY'

Evidentemente no debería dar este error, ya que la nueva clave primaria es Pepê y la ya existente es Pepe.


Buscando por google, encontré que podría ser había que describir el COLLATE de las tablas como utf8_general_ci, utf8_unicode_ci o utf8_bin entre otros muchos. Buscando más información comentaba que las comparaciones se hacían diferentes segundo el COLLATE y hablaba de los acentos, por lo que creía que era esto, establecí todas las tablas y el esquema principal como utf8_bin, que es la comparación binaria, pero me sigue dando el mismo error.


Bueno dicho esto todo ¿alguien tiene alguna idea como solucionar mi problema?

Saludos ;)


Título: Re: [MySQL] Problema con Unicode (UTF-8)
Publicado por: nhaalclkiemr en 13 Octubre 2011, 10:49 am
Al final tras mucho probar y buscar encontré la solución:

Como creía, el COLLATE es el que define como se tratarán los carácteres. Mi codificación estaba en UTF8, y el problema es que solo encontraba COLLATES Case Insensitive (por ejemplo utf8_general_ci o utf8_unicode_ci); ese ci del final significa case insensitive, y utf8 para MySQL no tiene COLLATES case sensitive. La única solución es usar utf8_bin que utiliza comparación binaria (según el valor binario del carácter).

Yo ya había probado a establecer el COLLATE por defecto de mi server MySQL, el COLLATE de mi BD y de mis tablas a utf8_bin; y me seguía sin funcionar. Al parecer hay que establecer en cada columna de cada tabla (la cual sea VARCHAR claro) el COLLATE a utf8_bin.

Esto me funcionó, pero me dió problemas en el script, ya que no me daba error si quería establecer manualmente el COLLATE de alguna clave foránea (o que tuviera referencias en otras tablas a esa clave), y esto ocurre aun no se ahora porque, pero me ocurría aunque en todas las claves foraneas que se referenciaban unas a otras estubieran establecidas igual.

Pues bueno, al final lo que hice fue primero crear las tablas estableciendo solamente las claves primarias y el COLLATE. Y una vez creadas, mediante ALTER TABLE crear las claves foráneas. Y así al final me funcionó.

Saludos ;)


Título: Re: [MySQL] Problema con Unicode (UTF-8)
Publicado por: djdm52 en 16 Noviembre 2011, 03:06 am
Oye amigo tengo un problema parecido con mi bd, cuando ingreso los registros en la bd se muestran con problemas los acentos y la ñ, pero cuando los importo desde otra bd igual se muestran bien, ¿que crees que sea? ya he intentado de todo con la condenadas Collationes.