una tablas relacionadas objeto mostrar insertar hacer guardar ejemplos desde datos consultas php mysql encoding propel object-serialization

php - tablas - Almacenar un objeto serializado en la base de datos MySql



mostrar datos de una base de datos en java (4)

Las cadenas creadas por serialize son cadenas binarias, no tienen una codificación de juego de caracteres específica, sino que son simplemente una "matriz" de bytes (donde -como un byte es de 8 bits, un octeto).

Si ahora toma una cadena y le dice a su base de datos que está codificada en LATIN-1 y su base de datos la almacena en un campo de texto con codificación UTF-8, la base de datos cambiará de forma transparente la codificación de LATIN-1 a UTF-8. UTF-8 es una codificación de conjunto de caracteres que utiliza más de un byte por carácter para algunos caracteres, por ejemplo, los que usted da en su pregunta como é .

El carácter é se almacena entonces como é dentro de la base de datos, que es la secuencia de bytes UTF-8 para é .

Si ahora busca los datos de la base de datos sin especificar en qué codificación los necesita, la base de datos lo devolverá como UTF-8.

Ahora la función de unserialize tiene un problema porque la cadena binaria ha sido modificada de manera que no es válida.

En su lugar, debe decirle a su base de datos que no debe modificar la codificación cuando almacena la cadena serializada, por ejemplo, eligiendo el tipo de columna correcto y la codificación (campo binario, BLOB - Documentos binarios de objetos grandes binarios , consulte también Documentos binarios Propel Docs ) O bien, cuando recupera los datos de la base de datos, revierte la codificación de juego de caracteres al formato original. El primer enfoque (campo binario) es mejor porque es exactamente lo que estás buscando.

Para los datos que ya se almacenaron en la base de datos en un formato incorrecto, debe corregir los datos. Para hacerlo, primero debe averiguar qué codificación se ha aplicado, por ejemplo, desde qué conjunto de caracteres a qué juego de caracteres. Supongo que es LATIN-1 pero no hay garantía. Debe averiguar la codificación de los datos y procesos de su aplicación actual para averiguarlo.

Una vez que se haya enterado, codifique los valores de nuevo desde UTF-8 a la codificación original.

Tengo un gran objeto php que quiero serializar y almacenar en una base de datos MySql. La codificación de la tabla es UTF-8 y la columna para contener la codificación del objeto serializado también es UTF-8 .

El problema es que el objeto contiene una cadena de texto que contiene caracteres franceses.

Por ejemplo:

Merci d''avoir passé commande avec Lovre. Voici le récapitulatif de votre commande

Cuando serializo el objeto, lo desinstalo de nuevo directamente, la cadena se mantiene y está en el formato correcto.

Sin embargo, cuando almaceno el objeto serializado en una base de datos MySql luego lo recupero nuevamente y luego lo desinstalo, la cadena se vuelve así:

Merci d''avoir passé commande avec Lovre. Voici le récapitulatif de votre commande

Algo sale mal cuando almaceno el objeto en la base de datos.

Notas:

  • El objeto se almacena usando Propel ORM.
  • El tipo de columna es text .
  • La cadena se almacena y lee desde un archivo html.

Siempre estoy almacenando datos esrializados usando base64_encode() . Los datos serializados a veces causan problemas, pero después de usar el valor base64, solo quedan caracteres simples.


Recomiendo encarecidamente que use json_encode en lugar de serializar. Algún día se encontrará tratando de usar esa información desde otro lugar que no sea PHP y tenerla almacenada en JSON la hace legible en todas partes; prácticamente todos los idiomas admiten la decodificación de JSON y es un estándar bien establecido.

¡La respuesta sobre el uso de utf8 en todas partes es válida! :-RE


asegúrate de usar utf-8 en todas partes , suena como que te perdiste algo.

en su caso, creo que olvidó establecer el juego de caracteres correcto para su conexión a la base de datos (usando una declaración SET NAMES o mysql_set_charset () ), pero eso es difícil de decir sin ver su código (y no sé propulsar) .

La siguiente es una cita de chazomaticus , que ha dado una respuesta perfecta en UTF-8 hasta el final , enumerando todos los puntos que tiene que encargarse:

Almacenamiento:

  • Especifique la utf8_unicode_ci (o equivalente) en todas las tablas y columnas de texto en su base de datos. Esto hace que MySQL físicamente almacene y recupere valores de forma nativa en UTF-8.

Recuperación:

  • En PHP, en cualquier envoltorio DB que use, deberá establecer el juego de caracteres de conexión a utf8. De esta forma, MySQL no realiza conversiones desde su UTF-8 original cuando transfiere datos a PHP. * Tenga en cuenta que si no utiliza un contenedor de DB, probablemente tendrá que emitir una consulta para decirle a MySQL que le proporcione resultados en UTF-8: SET NAMES ''utf8'' (tan pronto como se conecte).

Entrega:

  • Tienes que decirle a PHP que entregue los encabezados adecuados al cliente, por lo que el texto se interpretará como UTF-8. En PHP, puede usar la opción default_charset php.ini, o puede emitir manualmente el encabezado Content-Type , lo cual es solo más trabajo pero tiene el mismo efecto.

Sumisión:

  • Desea que todos los datos que le envíen los navegadores estén en UTF-8. Desafortunadamente, la única manera de hacer esto de manera confiable es agregar el atributo accept-charset a todas sus etiquetas <form> : <form ... accept-charset="UTF-8"> .
  • Tenga en cuenta que la especificación HTML del W3C dice que los clientes "deben" establecer de forma predeterminada el envío de formularios al servidor en cualquier juego de caracteres que sirva el servidor, pero esto es aparentemente solo una recomendación, de ahí la necesidad de ser explícito en cada etiqueta <form> .
  • Aunque, en ese frente, querrá verificar cada cadena enviada como UTF-8 válida antes de intentar almacenarla o usarla en cualquier lugar. El mb_check_encoding() PHP funciona, pero debes usarlo religiosamente.

Tratamiento:

  • Esta es, desafortunadamente, la parte difícil. Debe asegurarse de que cada vez que procese una cadena UTF-8, lo haga de manera segura. La forma más sencilla de hacerlo es haciendo un uso extensivo de la extensión mbstring de PHP.
  • Las operaciones de cadena de PHP NO son por defecto UTF-8 seguras. Hay algunas cosas que puede hacer con seguridad con las operaciones normales de cadenas de PHP (como la concatenación), pero para la mayoría de las cosas debe usar la función mbstring equivalente.
  • Para saber lo que estás haciendo (léase: no estropearlo), realmente necesitas conocer UTF-8 y cómo funciona en el nivel más bajo posible. Eche un vistazo a cualquiera de los enlaces de utf8.com para obtener algunos buenos recursos para aprender todo lo que necesita saber.
  • Además, creo que esto debería decirse en alguna parte, aunque parezca obvio: cada archivo PHP o HTML que se sirva debe codificarse en UTF-8 válido.

tenga en cuenta que no necesita usar utf-8; la parte importante es usar el mismo juego de caracteres en todas partes , independientemente de qué juego de caracteres sea. pero si necesita cambiar las cosas de todos modos, use utf-8.