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

MySql character set

Estas en el tema de MySql character set en el foro de Mysql en Foros del Web. Hola. Estoy teniendo problemas con php y mysql, pero creo que el problema viene de la codificación de caracteres de MySql. ¿Qué codificación tengo que ...
  #1 (permalink)  
Antiguo 08/01/2009, 17:44
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
MySql character set

Hola. Estoy teniendo problemas con php y mysql, pero creo que el problema viene de la codificación de caracteres de MySql. ¿Qué codificación tengo que usar para que MySql pueda trabajar con acentos de una forma correcta?. Hasta el momento, lo tengo en latin1, que es el valor por defecto.
El problema viene cuando quiero mostrar cadenas con acento en la página web. Cuando hago htmlentities($cadena), que es la función en php encargada de reemplazar las entidades html en una cadena, me salen unos símbolos raros en lugar de las letras acentuadas. También probé cambiando el charset a Utf8 de mi base de datos, pero tampoco puedo hacerlo funcionar.

Saludos.
__________________
Add, never Remove
  #2 (permalink)  
Antiguo 08/01/2009, 18:23
Avatar de Genetix  
Fecha de Ingreso: febrero-2002
Ubicación: Lima - Perú
Mensajes: 1.600
Antigüedad: 22 años, 2 meses
Puntos: 45
Respuesta: MySql character set

Tu pagina web en que formato esta?

Es preferible que tu pagina tenga la codificación UTF-8 en la cabecera y este guardado también en ese formato.

También puedes indicarle a MySql que trabaje con UTF-8 antes de realizar un consulta

Código sql:
Ver original
  1. mysql> SET NAMES 'utf8'
  2. mysql> SELECT * FROM tu tabla
Esto retornara todos los valores en UTF-8

mas info http://dev.mysql.com/doc/refman/5.0/...entations.html

Saludos
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #3 (permalink)  
Antiguo 08/01/2009, 18:50
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: MySql character set

La página tiene ese formato, lo que no sé decir es si está guardado en ese formato. ¿Cómo hago para saber en que formato la guardé?. Sinceramente es un tema al cual nunca le di demasiada importancia. Claro, hasta ahora.
Agradezco tu respuesta.
Saludos.
__________________
Add, never Remove
  #4 (permalink)  
Antiguo 09/01/2009, 02:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: MySql character set

mariano_donati:
Tienes que mirarlo en tu editor de texto utilizado para la programación. Yo, por ejemplo, utilizo NOTEPAD++ que en formato te permite elegir la codificación ANSI (que en windows se corresponde casi totalmente con latin1), utf8, etc. para los archivos html y php.

Mira este post donde reuní algunas indicaciones para escribir con utf8. Para hacerlo con otra codificación, los pasos serían los mismos, pero cambiando el charset y las collation usadas a las correspondientes a ese charset (puedes elegir entre varias codificaciones, pero que correspondan al charset).
Es sólo una orientación:
http://www.forosdelweb.com/f86/cotej...spanol-629105/, aunque Genetix ya te ha dicho cuál es el problema y dónde está la solución.
  #5 (permalink)  
Antiguo 09/01/2009, 04:29
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: MySql character set

Muy bueno!. Les agradezco no sabén cuanto. Tengo algunas dudas acerca de esto.

- En mi archivo my.ini modifiqué entre tantos cambios que había realizado modifiqué esta línea:

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf8

¿Por qué aunque haya hecho esto, no me funciona al no hacer la sentencia Set Names 'utf8'?

- Al crear la tabla puse que tenga cotejamiento utf8_unicode_ci. ¿Por qué es necesario también que a cada tabla le ponga este valor y también a cada campo en donde quiera trabajar con acentos?

- Si bien al mostrar los resultados en la web me figuran los datos correctamente, en la base de datos se guardan con símbolos raros.

- Cuando quiero buscar por ejemplo ..... Where campo = 'acá', y en mi base de datos existen datos que macheen con este parámetro, sin embargo no me arroja ningún resultado. Pero si pongo .... Where campo = 'aca' entonces así funciona de la forma esperada.

Bueno, espero que puedan ayudarme a entender un poco más que es lo que estoy haciendo para que funcione.
Saludos.

EDITO: Haciendo todo lo mismo, pero dejando los valores por defecto (latin1) y estableciendo el cotejamiento de los campos necesarios a latin1_spanish_ci, obtengo el mismo resultado, los datos se me muestran bien en la web, pero en la base de datos siguen apareciendo con simbolos raros.
__________________
Add, never Remove

Última edición por mariano_donati; 09/01/2009 a las 05:16
  #6 (permalink)  
Antiguo 09/01/2009, 09:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: MySql character set

- En mi archivo my.ini modifiqué entre tantos cambios que había realizado modifiqué esta línea:

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=utf8

Cita:
¿Por qué aunque haya hecho esto, no me funciona al no hacer la sentencia Set Names 'utf8'?
Piensa que lo que haces es que por defecto tu PhP usa el charset utf8, pero tú envías la información a un servidor y el servidor te la devuelve, y necesita saber en qué codificación la recibe y en qué codificación quieres que te la devuelva. Por otra parte, tú puedes decirle que tu PHP codifique en utf8, pero en los inputs del archivo html estés escribiendo en latin1, ISO-8859-1 o ANSI que para los efectos es casi lo mismo; y entonces envías a la base codificada en utf8, mediante un programa que por defecto usa utf8, a un servidor que te recibe utf-8 y devuevle utf-8, una cadena en ISO-8859-1, y ahí es donde hay problema.

Cita:
- Al crear la tabla puse que tenga cotejamiento utf8_unicode_ci. ¿Por qué es necesario también que a cada tabla le ponga este valor y también a cada campo en donde quiera trabajar con acentos?
- Cuando quiero buscar por ejemplo ..... Where campo = 'acá', y en mi base de datos existen datos que macheen con este parámetro, sin embargo no me arroja ningún resultado. Pero si pongo .... Where campo = 'aca' entonces así funciona de la forma esperada.
Esto no es necesario, pues puedes utilizar distintas collation para campos, incluso puedes cambiar la collation de un campo si lo consideras necesario. De hecho si al campo donde escribes acá le pones la collation utf8_bin te encontrará sólo las que tiene acento. Para esto están las distintas collation de cada charset, para elegir la que más te interese según la consulta que vayas a hacer sobre ese campo, y también para orden alfabético, etc. Las terminadas en ci (case insensitive) no distinguen entre mayúsculas y minúsculas, no tienen en cuenta los acentos, etc.

Cita:
- Si bien al mostrar los resultados en la web me figuran los datos correctamente, en la base de datos se guardan con símbolos raros.
Cita:
EDITO: Haciendo todo lo mismo, pero dejando los valores por defecto (latin1) y estableciendo el cotejamiento de los campos necesarios a latin1_spanish_ci, obtengo el mismo resultado, los datos se me muestran bien en la web, pero en la base de datos siguen apareciendo con simbolos raros.
Este, creo, es un problema mayor. Tú habías introducido los datos en latin1 y ahora los has cambiado a utf8. Los datos están grabados como latin1. Quizás deberías plantearte volver a latin1, es decir, dejar el my.ini como estaba. Volver a seleccionar el charset latin1 para la base. Elegir la collation latin1_bin o latin1_general_cs para los campos donde quieres que busque con acentos, y latin_spanisch_ci para aquellos en que prefieras que no importen los acentos ni las mayúsculas.
Además, guardar los archivos php y html como ANSI si trabajas en windows
Quitar el mysql_query ("set names 'utf8'")
y cambiar los meta de html dejando charset=ISO-8859-1 en lugar de utf-8
entre los <head></head>

<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-1>

Entonces verás, imagino, todo igual, el texto de tu base y el texto html generado con esos datos y tu programación en PHP y con html.
Eso es lo que yo entiendo.
  #7 (permalink)  
Antiguo 09/01/2009, 09:27
 
Fecha de Ingreso: julio-2008
Mensajes: 40
Antigüedad: 15 años, 9 meses
Puntos: 1
Respuesta: MySql character set

Pon en la web el mismo formato que en la base de datos o conviertelo.
El formato en la bse de datos no es latin solo, sera isoxxx latin o UTF8 latin
  #8 (permalink)  
Antiguo 09/01/2009, 10:44
 
Fecha de Ingreso: marzo-2005
Mensajes: 1.418
Antigüedad: 19 años, 1 mes
Puntos: 9
Respuesta: MySql character set

Muchas gracias a ambos por su respuesta.
Ahora estoy trabajando solo en MySql. Les comento lo que hice. Modifiqué el archivo my.ini y ahora quedo así:

# The default character set that will be used when a new schema or table is
# created and no character set is defined
default-character-set=latin1

Reinicié el servicio para que vuelva a tomar la configuración. A pesar de esto, en phpmyadmin, en la pantalla principal, me dice:

Juegos de caracteres de MySQL: UTF-8 Unicode (utf8)

Una vez hecho esto me cree una base de datos 'dd'.

Creo que aquí puede estar el problema. Es como que no me vuelve a tomar la configuración que traía por defecto.
Hay otro item que es Cotejamiento de las conexiones MySQL, está justo debajo de la opción que mencioné antes, y tiene el valor de latin1_spanish_ci. No sé si esto también podrá ser motivo del error, ya que como se habia dicho, el cotejamiento siempre está asociado al juego de caracteres. De todas formas, no me queda claro que es el cotejamiento de las conexiones MYSQL ¿esto sería como se comunica el servidor web con MySql?
__________________
Add, never Remove
  #9 (permalink)  
Antiguo 09/01/2009, 10:58
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: MySql character set

Mario_donati,

Si tú le dices a My.ini que por defecto usas utf-8, usará por defecto esa codificación o charset, pero si le indicas, aunque por defecto tengas utf-8, que quieres latin1, tendrás latin1.
Sobre la collation o cotejamiento, mira este enlace:
http://en.wikipedia.org/wiki/Collation
Su función es fundamentalmente ordenar y comparar datos, pero el charset no cambia, únicamente el algoritmo de comparación y ordenación de esos caracteres. Los caracteres seguirán siendo los mismos.

Lo que usa el servidor para recibir y devolver información es el charset. Aunque cuando tiene que ordenar y comparar datos, se sirve del cotejamiento o collation que hayas elegido. Por otra parte, utf-8 es una especie de pack parcial de un charset más amplio que sería UNICODE. Latin1, que equivale a ISO-8859-1 y que windows llama ANSI es el alfabeto latino y es una ampliación del código ASCII. Hoy en día tendemos a usar
el estándar ISO 10646 (Unicode), del cual utf-8 es una parte. Echa un vistazo a los artículos de wikipedia en la versión inglesa, que están bien. El problema es el número de bytes que se usan para guardar los distintos tipos: no es igual é en latin1 que é en utf8. De ahí los signos raros, pues algo codificado en utf-8 mostrará varios caracteres más en latin1. Pero, como te digo, ambos pueden usarse.
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 12:16.