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

UTF-8 versus ISO Latin 1

Estas en el tema de UTF-8 versus ISO Latin 1 en el foro de Mysql en Foros del Web. Hola a todos: Vengo un problema bastante pesado (por el trabajo que me pueda suponer). Planteamiento: Tengo una base de datos con cotejamiento Latin 1, ...
  #1 (permalink)  
Antiguo 03/02/2009, 17:53
Avatar de auttranadhie  
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Pregunta UTF-8 versus ISO Latin 1

Hola a todos:

Vengo un problema bastante pesado (por el trabajo que me pueda suponer).

Planteamiento:

Tengo una base de datos con cotejamiento Latin 1, así como las páginas PHP que voy generando en función de las consultas a dicha base de datos.

Problema:

Ahora estoy haciendo el procedimiento para que el visitante consulte a través de sus búsquedas textuales con una tabla de palabras inversas (no válidas para la consulta). El procedimiento evalúa las palabras y las comprueba con la mencionada tabla. Hasta aquí todo bien.

Si el visitante teclea, supongamos, un literal "qué" o "que" se comprueba con la tabla en donde hay un registro "que" que no lo tendrá en cuenta.

La cuestión surge porque el literal que ha introducido el usuario no concuerda con la tabla porque la palabra lleva tilde (i.e., acento gráfico). He estado observando el problema y ello se debe a que la tabla tiene el cotejamiento Latin 1.

Haciendo pruebas con UTF-8 no me ocurre (esto es, funciona como quiero).

Por otro lado, si declaro que el juego de caracteres de los ficheros PHP es UTF-8 me devuelve cajas vacías o símbolos extraños.

Mis preguntas:

1. ¿Que puedo hacer?

2. ¿Existe alguna recomendación por la cual deban usarse uno u otro juego de caracteres y, sobre todo, cómo usarse?

Gracias por adelantado y un saludo.

--
Alberto Uttranadhie (España)
  #2 (permalink)  
Antiguo 03/02/2009, 18:10
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: UTF-8 versus ISO Latin 1

Cita:
Por otro lado, si declaro que el juego de caracteres de los ficheros PHP es UTF-8 me devuelve cajas vacías o símbolos extraños.
Al momento de pasar un fichero con datos a UTF-8 es probable que algunos datos con tildes se conviertan en caracteres extraños, eso hay que corregirlo a mano, a la larga sera muchísimo mejor.

Si los datos que llamas de la DB contienen datos extraños, tienes que especificar durante la conexión a la DB que use UTF-8

revisa esto

http://www.forosdelweb.com/f86/mysql...er-set-660419/
__________________
"El conocimiento nos hace responsables."
twitter: @benjamingb
blog personal: http://codigolinea.com
ZF Manual en español http://manual.zfdes.com
  #3 (permalink)  
Antiguo 04/02/2009, 02:01
Avatar de auttranadhie  
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Respuesta: UTF-8 versus ISO Latin 1

Hola, Genetix:

He leído el enlace que me has dejado.

A mí en realidad me da en un pie utilizar una codificación o la otra. Supongo que UTF-8 es más amplia y será a la que se tienda. Lo único que pretendo es:

1.º Que mis consultas a la base de datos no tengan en cuenta caracteres dígrafos (p.e., caracteres con tildes "Á" o "è") y no discierna entre mayúsculas o minúsculas.

2.º Que el navegador pueda interpretar adecuadamente el conjunto de caracteres. Cuando le digo que es UTF-8 devuelve lo que he comentado. Si por este lado debo configurar alguna cosa me resultaría mejor incluso aunque tenga que cambiar el cotejamiento de las tablas.

Gracias y un saludo.

--
Alberto Uttranadhie (España)
  #4 (permalink)  
Antiguo 04/02/2009, 04:24
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: UTF-8 versus ISO Latin 1

uttranadhie,

tu problema tiene fácil solución, creo, pero debes aclararnos alguna cuestión. Dices que tienes un cotejamiento latin1. Latin1 es una codificación o charset, no un cotejamiento o collation, y si tu base está codificada en latin1, lo único que tendrías que hacer es cambiar la collation del campo donde quieras hacer la búsqueda sin discriminar acentos ni mayúsculas a una collation o cotejamiento latin1_spanish_ci por ejemplo. Y creo que ya estaría. Otra cosa es que tengas codificados los archivos PHP y hmtl en utf8, cuando deberías tenerlos en iso-8859-1, latin1, alfabeto occidental o alguno de estos (vienen a ser casi lo mismo). Por otra parte, habría que tener en cuenta lo que pases por URL, es decir, por get, pues los navegadores parecen estar funcionando en utf8. Pero, lo primero es lo primero, prueba a cambiar la collation o cotejamiento del campo a latin1_spanish_ci, por ejemplo. Y luego dinos qué ocurre.
  #5 (permalink)  
Antiguo 04/02/2009, 13:27
Avatar de auttranadhie  
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Respuesta: UTF-8 versus ISO Latin 1

Hola, jurena:

He estado haciendo pruebas por ver qué es lo que pasaba. Nada concluso, te adelanto.

1. En el phpMyAdmin

He creado unas pruebas y he definido toda la jerarquía (administrador, base de datos, tabla y campo) con cotejamientos:

1.1. latin1_general_ci

He realizado SELECT tanto desde una página PHP como desde phpMyAdmin. El resultado es que no devuelve registros deseados en ninguno de los casos.

1.2. utf8_unicode_ci

He realizado la misma prueba y sólo devuelve registros deseados en la consulta desde phpMyAdmin (esto es, independientemente de si la entrada es en mayúsculas, con tilde o no, etc.)

Por lo que veo, parece ser que va a ser el cotejamiento que he de escoger.

Concluyendo este primer apartado de mi respuesta, el fallo está entre el PHP y la base de datos. ¿Alguna idea? ¿Tiene que ver algo el servidor Apache?

2. Conjunto de caracteres UTF-8

Entiendo perfectamente lo del cotejamiento y los conjuntos de caracteres; aún así he estado haciendo averiguaciones. En concreto, me he acercado por una página que comprueba si puedes ver correctamente la tabla UTF-8 Unicode, en:

http://freenet-homepage.de/prilop/multilingual-1.html

Lo que no comprendo es porqué si defino adecuadamente la etiqueta meta para el conjunto UTF-8 el navegador no lo interpreta como lo hace con la página de prueba antes referida. Es más, para verse bien ¡tengo que cambiar la visualización de la página a Europeo Occidental! (en cualquier navegador: IE, FF, Opera, Safari, ...)

Si tenéis alguna idea, bienvenida sea. Gracias, como siempre, y un saludo.

--
Alberto Uttranadhie (Madrid, España)
  #6 (permalink)  
Antiguo 04/02/2009, 14:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: UTF-8 versus ISO Latin 1

uttranadhie,

sé que habrás leído mucho, pero aún te recomendaría que echaras un vistazo a estos dos posts. En uno, trato de orientar sobre cómo usar utf8; en otro, krowork, de php hispano ofrece algunas indicaciones que yo considero de gran interés para este tema.
http://www.forosdelweb.com/f86/cotej...spanol-629105/

indicaciones de krowork
http://www.php-hispano.net/index.php..._post&id=33654
Sé que krowork ha ofrecido indaciones en otros posts para hacer que el servidor no cause problemas a la hora de usar utf8, pero yo, de momento, probaría a usar el SET NAMES como sugerimos en el primer enlace.

Echa un vistazo y prueba a seguir algunas de las recomendaciones. Si sigues teniendo problemas haremos un debugueo paso por paso.
  #7 (permalink)  
Antiguo 05/02/2009, 02:33
Avatar de auttranadhie  
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Respuesta: UTF-8 versus ISO Latin 1

Hola, de nuevo, jurena:

He estado leyendo con mucho detenimiento tu explicación en el foro y veo que hay algunas cosas que debo tener muy presentes.

Realizaré algunas pruebas que detallaré en un próximo mensaje por ver si voy por buen camino.

Sin embargo, te adelanto que:

1.º He configurado Notepad++ para que por defecto guarde las páginas PHP como UTF-8, aunque aún no entiendo lo del BOM.

2.º La función con SET NAMES aún me devuelve cajas vacías aunque sí realiza las consultas.

Hay alguna cosa más, pero prefiero ordenarlas para que las puedas analizar con mayor facilidad. Ya que tienes la gentileza de responder, es lo mínimo que puedo hacer.

Gracias de nuevo y un saludo.

--
Alberto Uttranadhie (Madrid)
  #8 (permalink)  
Antiguo 05/02/2009, 04:08
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: UTF-8 versus ISO Latin 1

Alberto,
Cita:
1.º He configurado Notepad++ para que por defecto guarde las páginas PHP como UTF-8, aunque aún no entiendo lo del BOM.
Está bien lo de Notepad++, aunque hay otros editores gratuitos, algunos con muchas otras posibilidades, pero Notepad++ está bien.
Sobre el BOM, mira este enlace de wikipedia:
http://es.wikipedia.org/wiki/Byte_Order_Mark
Pero lo que a ti te interesa saber es que si usas sesiones, lo primero que debe salir son los header, y si tienes alguna salida anterior (el BOM lo es; es lo primero, aunque sea invisible), te impedirá seguir con la sesión. De modo que lo guardas con otra codificación y lo muestras como utf8, o lo guardas como utf8 sin BOM, y ya no pone esa molesta marca para las sesiones. Pero si no utilizas sesiones, olvídate de todo esto que te digo.

Cita:
2.º La función con SET NAMES aún me devuelve cajas vacías aunque sí realiza las consultas.
con set names sólo indicas al servidor la codificación que le envías y cómo quieres que te la devuelva. En realidad es un dos por uno. El problema no es mysql_query("SET NAMES 'utf8'"); si lo utilizas en su lugar y bien, le dices al servidor que le envías la información en codificación utf8 y debe devolvértelo en ella. Puesto que la información la tendrías en una base codificada en utf8, ahora los problemas se podrían producir al mostrarla en el html (archivos html y php) o si pasas algo por la URL (los navegadores usan utf8 por defecto, según tengo entendido). Sea con los header o con los meta podrás verlo todo en utf8, pero, ojo, si la información se incluyó con codificación iso-8859-1 o latin1 en su momento y luego has cambiado a utf8 la codificación de la base, seguro que tienes problemas.
  #9 (permalink)  
Antiguo 05/02/2009, 15:39
Avatar de auttranadhie  
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Respuesta: UTF-8 versus ISO Latin 1

Estimado jurena:

Lo primero es comentarte que he aplicado todas tus indicaciones y las pruebas que he realizado han ido perfectamente. Ahora todo funciona como deseaba. Por supuesto, he tenido que cambiar los cotejamientos de la base de datos (22 tablas) y los ficheros PHP han sido configurados como indicabas.

Lo segundo es agradecerte las explicaciones y el tiempo empleado. Creo que hacéis una labor increible y es digno y necesario reconocéroslo.

Por último, comentarte, si es que hay solución, una cosita que no sé si es PHP o depende de los conjuntos de caracteres: en algunos de los datos devueltos utiizo funciones de tipo cadena (p.e., strtolower()) y en ocasiones, habiendo guardado los datos en UTF-8, y luego utilizando estas funciones vuelven a aparecer los consabidos cuadros vacíos; sin embargo, si no los incluyo dentro de las funciones, los datos se muestran correctamente. ¿Tienes alguna idea de por qué puede darse esto?

Gracias de nuevo y recibe un cordial saludo.

--
Alberto Uttranadhie (Madrid, España)
  #10 (permalink)  
Antiguo 05/02/2009, 23:45
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años, 1 mes
Puntos: 300
Respuesta: UTF-8 versus ISO Latin 1

Esto no es MySQL, sino PHP, creo. Pido, pues, disculpas al moderador por incluir la sintaxis php de la función en este foro y le ruego que si no lo considera oportuno la elimine. Dejo la dirección:
http://es2.php.net/manual/es/function.strtolower.php
Mira allí en las notas la función específica que llama strtolower_utf8() ofrecida por dbers26.
  #11 (permalink)  
Antiguo 06/02/2009, 06:40
Avatar de auttranadhie  
Fecha de Ingreso: noviembre-2008
Ubicación: Madrid (España)
Mensajes: 156
Antigüedad: 15 años, 5 meses
Puntos: 8
Respuesta: UTF-8 versus ISO Latin 1

Hola, de nuevo, jurena:

Muchas gracias por la respuesta. Aplicaré la función (seguro que va bien).

Gracias también al moderador por habernos permitido continuar el hilo de discusión en este foro.

Recibid un saludo.

--
Alberto Uttranadhie (Madrid)
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 17:58.