2012-05-27 20 views
10

Estoy serializando una gran cantidad de matrices en php que deben almacenarse en una base de datos utilizando mysql.¿Qué tipo de columna mysql para serializar (datos)?

La longitud de la secuencia final puede variar mucho de cualquier cosa entre 2000 y 100.000+, me preguntaba cuál sería el mejor tipo de columna para esto.

Actualmente lo tengo configurado como LONGTEXT pero creo que esto es exagerado. La base de datos ya está activa y tiene alrededor de 3 millones de filas; esta es una nueva columna que se agregará pronto.

Gracias

+4

100,000 caracteres muy altamente restringe sus opciones. Además, si alguna vez quiere manipular estas matrices en MySQL o buscarlas, o básicamente hacer algo más que tratarlas como una masa de datos gigantesca, debe almacenarlas correctamente en lugar de serializarlas. – Corbin

+0

Es solo un centro de almacenamiento de datos que se mostrará a través de php, la manipulación a través de mysql nunca ocurrirá. Gracias @corbin – hadley

+0

mejor con tipos de campo longbinary. todos los campos de texto están sujetos a traducciones de juegos de caracteres, lo que podría dañar sus datos serializados. –

Respuesta

15

Siempre use cualquier BLOB data-type para serializar los datos para que no consigue cortar y romper la serialización de una manera segura binario. Si no hay un máximo para la longitud de la cadena final, necesitará LONGBLOB. Si sabe que los datos no llenarán 2^24 caracteres, puede usar MEDIUMBLOB. MEDIUMBLOB es de aproximadamente 16 MB, mientras que LONGBLOB es de aproximadamente 4 GB, por lo que diría que es bastante seguro con MEDIUMBLOB.

¿Por qué un tipo de datos binarios? Los tipos de datos de texto en Mysql tienen una codificación. La codificación de caracteres tendrá un efecto sobre cómo se transpone la información serializada entre las diferentes codificaciones. P.ej. cuando se almacena como Latin-1 pero luego se lee como UTF-8 (por ejemplo, debido a la configuración de codificación de conexión del controlador de base de datos), los datos serializados pueden romperse debido a que los desplazamientos binarios cambiaron, pero los datos serializados no se codificaron para dichos cambios. Las cadenas serializadas de PHP son datos binarios, no con ninguna codificación específica.

7

Debe elegir BLOB (como se ha señalado Marc B) según el manual de PHP para serializar():

"Tenga en cuenta que esta [salidas] una cadena binaria que puede incluir bytes nulos, y tiene que ser almacenados y manejado como tal. Por ejemplo, la salida serialize() generalmente se debe almacenar en un campo BLOB en una base de datos, en lugar de un campo CHAR o TEXT. "

Fuente: http://php.net/serialize

Por supuesto la entrada de J.Money respecto tamaños hay que tener en cuenta también - incluso BLOB tiene sus límites, y si se va a superarlas entonces deberá MEDIUMBLOB o LONGBLOB .

Cuestiones relacionadas