Ver Mensaje Individual
  #21 (permalink)  
Antiguo 11/07/2011, 11:08
Avatar de Tecna
Tecna
 
Fecha de Ingreso: enero-2010
Mensajes: 291
Antigüedad: 14 años, 3 meses
Puntos: 45
Respuesta: Problema al validar un sitio

Buenas,

mysql usa varias codificaciones independientes, todo lo referente a la administración está siempre en utf-8 para que cualquier usuario de cualquier pais pueda crear bases de datos con los nombres de las tablas y demás en su propio idioma. Por otro lado está la codificación que se asigna al crear la base, tabla o lo que sea y que afecta a la forma de guardar los datos, pero también está la codificación que se usa en las conexiones con los clientes, que afecta a lo forma en que se muestran los datos en las consultas y que si no se ha especificado en el servidor lo devuelve en la codificación que use el cliente. Eso probablemente es lo estaba ocurriendo en este caso que si la petición se hizo en ISO-8859 el servidor intenta devolverlo en esa codificación y como utf-8 usa más bytes para la codificación y es de longitud variable, la conversión resulta errorea y estaba intentando imprimir el caracter de fin de registro, por eso daba ese error, además de mostrar mal otros caracteres como los acentuados. Con SET NAMES cambias las 3 variables que controlan la codificación de las conexiones pero tienes que hacerlo en cada conexión, se puede añadir en el fichero de opciones de configuración --default-character-set= y así siempre funcionará sin tener que añadir nada más, también se puede poner la variable character_set_results a NULL para que el servidor no haga conversiones de codificación por su cuenta.

Por otro lado dices que tienes la base con la codificación utf8_general_ci que es una codificación antigua y tiene limitaciones y menos exactitud en las comparaciones, puedes usar utf8_unicode_ci o mejor usar utf8_spanish_ci o utf8_spanish2_ci para que tenga en cuenta las ñ y las ch a la hora de ordenar los datos o enviar las consultas.

Yo creo que siempre es mejor usar utf-8 como codificación porque es capaz de representar correctamente muchos más caracteres, no sólo gráficos de muchos idiomas, también de formato como saltos de línea, fin de fichero y tiene compatibilidad con ASCII en el que las primeras posiciones eran para caracteres de control, todo eso también lo tiene ISO-8859 pero tiene menos posibilidad de crecer y representar más caracteres por eso son más localizados, enfocados a determinados idiomas, como la ISO-8859-1 para europa occidental y la ISO-8859-15 ampliación que se hizo para el euro. utf-8 quiere ser más universal, por eso es de las pocas codificaciones admitidas por el estandar Unicode, que no es exactamente lo mismo, ya que Unicode es el estandar y engloba también a utf-16 y a utf-32 y a otras futuras que pudieran incluir siempre que puedan representar todos los caracteres y algún requisito más. La codificación de caracteres es un tema muy complejo, a veces lo que en local se ve bien en el servidor no, o al revés, o depende del navegador, o como el caso que se comentaba con bases de datos y da menos problemas usar utf-8 porque está mas extendido y hay más gente en el mundo que lo usa, no solo en hardware ya que muchas veces no tenemos acceso a la configuracción de servidor, también en software, declarando siempre todas las cabeceras sin dejar lugar a la improvisación del navegador. Es la manera de asegurarse que más gente lo verá correctamente, incluidos programas, traductores por ejemplo, sobre todo si están hechos por angloparlantes.