Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Mysql y las "p..." codificaciones de caracteres

Estas en el tema de Mysql y las "p..." codificaciones de caracteres en el foro de Mysql en Foros del Web. A ver tengo un problema. El tema es el siguiente, me gusta usar la codificación utf-8 , probablemente un poco sugestionado por haber escuchado siempre ...
  #1 (permalink)  
Antiguo 10/05/2014, 18:52
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Mysql y las "p..." codificaciones de caracteres

A ver tengo un problema. El tema es el siguiente, me gusta usar la codificación utf-8, probablemente un poco sugestionado por haber escuchado siempre que es la mejor.

El problema lo tengo cuando quiero hacer búsquedas en la BD. Imaginemos que rellena el formulario un tal José y su nombre se guarda en la base de datos que tengo codificada en utf-8_general_ci de esta manera José.

Ahora supongamos que otro usuario que también se llama José, quiere registrarse, pero se equivoca y se le olvida poner la tilde y escribe Jose. Yo no quiero que el nombre se pueda repetir, así que antes busco si el nombre que escribió el usuario se encuentra en la base de datos. Y el problema me viene en que para MySQL José no es lo mismo que Jose. Y tiene lógica, puesto que cuando guarda el primero escribe José por lo tanto no es lo mismo que cuando viene con los caracteres latinos.

La única solución que se me ocurre a mi es codificar los datos a Latín1 en php antes de guardarlos y poner las bases de datos en latin1_spanish_ci, de esta manera se me guardará con la tilde y el case insentive me dira que lo busque con tilde o sin tilde o en mayúsculas el nombre ya existe. Pero eso me supone un trabajo enorme al tener que andar codificando y decodificando cada dato que guardo y extraigo de la base de datos.

Podría pasar toda la página a latin1, pero me encuetro con el problema de que uso principalmente AJAX y de nuevo tengo que andar codificando y decodificando en este caso todo lo que me envía AJAX, ya que sus respuestas son siempre en UTF-8.

En fin un puto rollazo este de los caracteres que no me deja de hacer comerme la cabeza siempre. Alguien sabe como solucionar lo de las búsquedas en MySQL haciéndose insensible a las tildes y estando codificada en utf-8

Gracias familia
__________________
Diseño Web - Arisman Web
  #2 (permalink)  
Antiguo 10/05/2014, 19:10
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Mysql y las "putas" codificaciones de caracteres

He de aclara que las busquedas las hago utilizando LIKE y que cuando lo hago desde PHPmyadmin, el resultado es el mismo. Si busco poniendo Jose, no me reconoce que José ya está almacenado en la base de datos pero con esta codificación: José
__________________
Diseño Web - Arisman Web
  #3 (permalink)  
Antiguo 10/05/2014, 19:35
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Mysql y las "p..." codificaciones de caracteres

Cita:
Iniciado por manuparquegiralda Ver Mensaje
A ver tengo un problema. El tema es el siguiente, me gusta usar la codificación utf-8, probablemente un poco sugestionado por haber escuchado siempre que es la mejor.
Depende para qué, en qué dioma trabajes y cual sea el objetivo. Como siempre se dice, "mejor" es un concepto inexistente en informática. Puede ser "adecuado", "conveniente", etc. Pero no "mejor". Lo "mejor" requiere definir el contexto.

Cita:
Iniciado por manuparquegiralda Ver Mensaje
El problema lo tengo cuando quiero hacer búsquedas en la BD. Imaginemos que rellena el formulario un tal José y su nombre se guarda en la base de datos que tengo codificada en utf-8_general_ci de esta manera José.
Si te sucede eso es que tienes un error entre el ingreso y el envío a la base, porque en UTF8 debería haberse guardado como "José". Es decir, hay un error en alguna de estas partes:
- Codificación del formulario.
- Codificación de la conexión a MySQL.
- Codificación al crear la query de inserción.
El 99% de las veces son errores de programación en algún paso, donde el dato se corrompe.
Cita:
Iniciado por manuparquegiralda Ver Mensaje
Ahora supongamos que otro usuario que también se llama José, quiere registrarse, pero se equivoca y se le olvida poner la tilde y escribe Jose. Yo no quiero que el nombre se pueda repetir, así que antes busco si el nombre que escribió el usuario se encuentra en la base de datos. Y el problema me viene en que para MySQL José no es lo mismo que Jose. Y tiene lógica, puesto que cuando guarda el primero escribe José por lo tanto no es lo mismo que cuando viene con los caracteres latinos.
La codificación UTF8, lo mismo que en otros casos, considera iguales semánticamente la "e" y la "é". Precisamente por necesidades de la logica de consultas. Para eso están precisamente las collation, que te conviene tratar de estudiar para dominar, a fin de no enredarte con el tema.
Cita:
Iniciado por manuparquegiralda Ver Mensaje
La única solución que se me ocurre a mi es codificar los datos a Latín1 en php antes de guardarlos y poner las bases de datos en latin1_spanish_ci, de esta manera se me guardará con la tilde y el case insentive me dira que lo busque con tilde o sin tilde o en mayúsculas el nombre ya existe. Pero eso me supone un trabajo enorme al tener que andar codificando y decodificando cada dato que guardo y extraigo de la base de datos.
Trasladarías el problema a una collation nueva, pero no dejaría de existir. Que la base sea de charset por default Latin1 no resolverá el problema del formulario
Cita:
Iniciado por manuparquegiralda Ver Mensaje
Podría pasar toda la página a latin1, pero me encuetro con el problema de que uso principalmente AJAX y de nuevo tengo que andar codificando y decodificando en este caso todo lo que me envía AJAX, ya que sus respuestas son siempre en UTF-8.
Precisamente. Pasar la collation a otra no resuelve nada. Sólo agrega un problema nuevo.
Cita:
Iniciado por manuparquegiralda Ver Mensaje
En fin un puto rollazo este de los caracteres que no me deja de hacer comerme la cabeza siempre. Alguien sabe como solucionar lo de las búsquedas en MySQL haciéndose insensible a las tildes y estando codificada en utf-8

Gracias familia
En definitiva, el problema que tienes se resuelve depurando principalmente la aplicación, no la base. Si tienes la base en UTF8 y tienes problemas de caracteres, no le cargues la culpa a la base. La base sólo almacena lo que recibe, y si recibe mal el dato... lo guardará mal.
Aunque no lo creas y me insistas que la aplicación anda bien, desde ya te digo que no es así. Esto lo hemos discutido muchas veces con otros foristas que insistían en que tenían todo OK, y luego de un profundo rastreo, siempre se encontraron "agujeros" por los cuales el UTF8 estaba pasando corrupto, mal administrado. Y en todos los casos la solución fue corregir algo de la aplicación (principalmente el charset de la conexión).
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 10/05/2014, 19:48
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 10 meses
Puntos: 39
Respuesta: Mysql y las "p..." codificaciones de caracteres

Cita:
Iniciado por gnzsoloyo Ver Mensaje

Si te sucede eso es que tienes un error entre el ingreso y el envío a la base, porque en UTF8 debería haberse guardado como "José". Es decir, hay un error en alguna de estas partes:
- Codificación del formulario.
- Codificación de la conexión a MySQL.
- Codificación al crear la query de inserción.
El 99% de las veces son errores de programación en algún paso, donde el dato se corrompe.
Infinitas gracias gnzsoloyo. Me has hecho ver algo que había pasado completamente por alto, vamos que ni conocía. El problema estaba en la codificación de la query de inserción. Ya que no sabía que en la base de datos no se tenía que guardar con esos caracteres extraños.

Lo pongo para futuras dudas que pueda tener alguien. Lo he solucionado poniendo esta query en el archivo de conexión a la base de datos:

Código PHP:
Ver original
  1. mysql_query("SET NAMES 'utf8'",$conexion);

De esta manera se me guardá José tal cual en la base de datos y soluciona el problema de las tildes y acentos.
__________________
Diseño Web - Arisman Web

Etiquetas: caracteres, php, sql
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:44.