2011-08-11 10 views
30

Estoy en un dilema sobre el ahorro de valores de fecha y hora en el formato TIMESTAMP de MySQL vs en un formato INT no identificado personalizado. Las principales consideraciones aquí son la velocidad de recuperación, los cálculos de rango apropiados en PHP y el formato ocasional en valores legibles por humanos.Uso de TIMESTAMP de MySQL versus almacenamiento de marcas de tiempo directamente

El espacio de almacenamiento requerido para cada tipo y sus rangos:

DATETIME  8 bytes '1000-01-01 00:00:00' to '9999-12-31 23:59:59' 
TIMESTAMP  4 bytes '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC 
UNSIGNED INT 4 bytes (Maximum Value 4294967295) 

I no necesita la gama de DATETIME en absoluto. Estoy dividido entre TIMESTAMP y UNSIGNED INT.

Los argumentos a favor de UNSIGNED INT:

  • Una marca de tiempo UNIX de 4294967295 convertidos a Sun, 07 Feb 2106 06:28:15 GMT que es más que TIMESTAMP y lo suficientemente bueno para mí
  • Comparando estos marcas de tiempo directamente en PHP sería más rápido en lugar de convertir TIMESTAMP a través strtotime() y luego compararlos

la única ventaja TIMESTAMP daría a mí es cuando estoy leyendo en los valores de la tabla MySQL de forma manual y necesito ' verlas.

¿Hay alguna razón convincente para usar TIMESTAMP y no una INT NO FIRMADA?

+0

See related: [datetime vs timestamp?] (Http://stackoverflow.com/questions/409286/datetime-vs-timestamp) – JYelton

+0

Una marca de tiempo de 32 bits solo irá hasta enero de 2038, y muchas bibliotecas todavía usan 32bit time_t en lugar de 64 bits, por lo que puede encontrarse con problemas de portabilidad. Internamente, PHP almacena las marcas de tiempo/fecha y hora en formato numérico de todos modos, y solo se convierte en las bonitas cadenas de tipo yyyy-mm-dd en la recuperación. –

Respuesta

20

Argumentos para TIMESTAMP

  • implícitamente almacena los datos en la zona horaria GMT. No importa cuál sea tu zona horaria de sesión. Útil si necesita usar diferentes zonas horarias.
  • columnas TimeStamping Puede haber automatizados utilizando DEFAULT CURRENT_TIMESTAMP o ON UPDATE CURRENT_TIMESTAMP (una columna por tabla sólo hasta MySQL 5.6.5)
  • Puede utilizar la función de fecha y hora para la fecha de comparación, suma, resta, rango de búsqueda, etc, sin la necesidad de utilizar FROM_UNIXTIME() función - que hará que sea más fácil de escribir consultas que se pueden utilizar índices
  • en PHP

    >> date('Y-m-d h:i:s',4294967295); 
    '1969-12-31 11:59:59' 
    

    lo que el rango es de hecho la misma

Cuando se utiliza UNIX_TIMESTAMP() en una columna TIMESTAMP, la función devuelve el interior valor de marca de tiempo directamente, sin conversión implícita “-cadena-a-marca de tiempo Unix”

+1

'echo date ('Y-m-d h: i: s', 4294967295);' para mí da 2106-02-07 06:28:15 - ¿estás usando un sistema operativo de 32 bits? –

+1

No, es un 64b Windows, pero creo que tengo un PHP 32b en ejecución. Es algo que debe tener en cuenta si desea que su aplicación sea portátil. Si tendrá el control sobre el entorno de producción, entonces no importa. – Mchl

+2

En cuanto a su segunda viñeta, solo se puede hacer una columna DEFAULT CURRENT_TIMESTAMP o ON UPDATE CURRENT_TIMESTAMP, como se señala aquí (al menos en MySQL v5.1): http://dev.mysql.com/doc/refman/5.1/ es/timestamp-initialization.html –

2

Esto no puede ser un "científico" una Sin embargo, siempre encuentro la manera en que MySql maneja la conversión, la aritmética, la comparación, etc. en columnas TIMESTAMP confusas. Una columna INT no firmada es mucho más directa y siempre sé qué esperar.

P.S.Quizás otra cosa a favor de la columna TIMESTAMP es su capacidad para establecerse automáticamente a la hora actual después de cada actualización o inserción, pero eso no es algo que no puede vivir sin él.

8

El único uso real para TIMESTAMP es cuando desea que ese campo se actualice automáticamente cuando se actualiza la fila (que es el comportamiento predeterminado para ese campo), o cuando los requisitos de almacenamiento de datos son tan estrictos que 4 bytes por fila realmente hace una diferencia para ti

realmente la comparación debe estar entre DATETIME y UNSIGNED INT, y se lo recomiendo porque DATETIME:

  • puede utilizar las funciones de fecha/hora nativos de MySQL para la selección de rangos de fechas, etc.
  • Es Trivially easy para seleccionar estas fechas como marcas de tiempo UNIX para formatear fácilmente en PHP: SELECT UNIX_TIMESTAMP(field) FROM table, sin necesidad de seleccionar el valor bruto y usar strtotime
  • Más fácil de leer y editar los campos en su base de datos directamente si es necesario (como usted señalado).
  • No hay limitaciones en el intervalo de fechas

Punto dos solos realmente elimina cualquier razón para almacenar en números enteros, en mi opinión.

+1

La desventaja de DATETIME es que no almacena el desplazamiento GMT en el campo. O necesita convertir todo antes de almacenarlo en GMT (o lo que quiera que sea su tiempo 'zulu') y luego convertirlo de nuevo si se trata de varias zonas horarias. Almacenar en INT elimina algunos de estos requisitos. – ashurexm

+0

Una ventaja para DATETIME es que soy flojo y funciona bastante bien para una configuración regional/zona horaria única. – ashurexm

+0

Gracias por el comentario sobre 'UNIX_TIMESTAMP' - No sabía de esto antes. –

Cuestiones relacionadas