PHP: json_encode vs serialize para almacenar en una base de datos MySQL

Estoy almacenando algunos datos “no estructurados” (una matriz con clave) en un campo de mi tabla, y actualmente estoy usando serialize () / unserialize () para “convertir” de una matriz a otra.

De vez en cuando, sin embargo, recibo errores al deserializar los datos. Creo que estos errores ocurren debido a los datos Unicode en las cadenas dentro de la matriz que estoy serializando, aunque hay algunos registros con datos Unicode que funcionan muy bien. (El campo DB es UTF-8)

Me pregunto si usar json_encode en lugar de serialize hará la diferencia / hará que sea más resistente. Esto no es trivial para mí probar, ya que en mi entorno de desarrollo todo funciona bien, pero en producción, de vez en cuando (alrededor del 1% de los registros) aparece un error.

Por cierto, sé que me estoy esforzando por encontrar una explicación real para el problema y estoy probando algo a ciegas, estoy esperando poder deshacerme de esto sin pasar demasiado tiempo en ello.

¿Crees que usar json_encode en lugar de serialize hará que sea más resistente a los “errores de serialización“? El formato de datos me parece más “indulgente” …

ACTUALIZACIÓN : El error real que obtengo es:

Notice: unserialize(): Error at offset 401 of 569 bytes in C:\blah.php on line 20 

¡Gracias! Daniel

JSON tiene una ventaja principal:

  • compatibilidad con otros idiomas aparte de PHP.

La serialize de PHP tiene una ventaja principal:

  • está específicamente diseñado para almacenar datos basados ​​en PHP, sobre todo, puede almacenar objetos serializados, instancia de clases, que se volverán a instanciar al tipo de clase correcto cuando la cadena se deserialice.

(Sí, esas ventajas son exactamente lo opuesto entre sí)

En su caso, como está almacenando datos que no están realmente estructurados, ambos formatos deberían funcionar bastante bien.

Y el problema de encoding que tiene no debe relacionarse con la serialización en sí misma: siempre que todo (DB, conexión a la base de datos, archivos PHP, …) esté en UTF-8, la serialización debería funcionar también.

La gente de FriendFeed optó por una solución similar usando JSON. Deberías echarle un vistazo a la publicación de tu blog al respecto.

Si el problema es (y creo que lo es) en la encoding UTF-8, no hay diferencia entre json_encode y serialize . Ambos dejarán la encoding de caracteres sin cambios.

Debe asegurarse de que su base de datos / conexión esté configurada correctamente para manejar todos los caracteres UTF-8 o codificar el registro completo en la encoding admitida antes de insertarlo en la base de datos.

También especifique qué significa “Me sale un error”.

Encontré esto en los documentos de PHP …

 function mb_unserialize($serial_str) { $out = preg_replace('!s:(\d+):"(.*?)";!se', "'s:'.strlen('$2').':\"$2\";'", $serial_str ); return unserialize($out); } 

No lo entiendo del todo, pero funcionó para deserializar los datos que antes no podía volver a serializar. Movido a JSON ahora, informaré en un par de semanas si esto resolvió el problema de obtener aleatoriamente algunos registros “corruptos”

json_encode () convierte símbolos que no son ASCII (p. ej., “Schrödinger” se convierte en “Schr \ u00f6dinger”) pero serialize () no.

Fuente: https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make#common-mistake-6–ignoring-unicodeutf-8-issues


Para dejar intactos los caracteres UTF-8, puede usar la opción JSON_UNESCAPED_UNICODE a partir de PHP 5.4.

Fuente: https://stackoverflow.com/a/804089/1438029

Como decisión de diseño, optaría por almacenar JSON porque solo puede representar una estructura de datos, mientras que la serialización está vinculada a una firma de objetos de datos de PHP.

Las ventajas que veo son: * se ve obligado a separar el almacenamiento de datos de cualquier capa lógica en la parte superior. * usted es independiente de los cambios en la clase de objeto de datos (digamos, por ejemplo, que desea agregar un campo).