sistema operativo historia caracteristicas mysql datetime unix-timestamp

mysql - operativo - ¿Cómo deben almacenarse las marcas de tiempo de Unix en columnas int?



unix caracteristicas (1)

Tengo una tabla de registro que contendrá millones de escrituras por razones estadísticas. Todas las columnas son claves extranjeras int. También voy a agregar una columna de marca de tiempo para cada fila. Dado que DATETIME toma 8bits, estaré usando int(10) unsigned para cortar el espacio de almacenamiento (y el índice en esa columna) a la mitad.

Sin embargo, me pregunto cuándo esta columna ya no funcionará. A las 3:14:07 AM del 19 de enero de 2038, el valor de 9.999.999.999 será un problema para las marcas de tiempo de UNIX, pero una int sin firmar en MySQL solo tiene una capacidad de 4.294.967.295 y la marca de tiempo 4294967295 muestra un número no válido en mi aplicación PHP.

Entonces, ¿qué significa esto? ¿El final del almacenamiento de marcas de tiempo int en MySQL va a ser en algún momento en 2021 ya que no puede llegar al 9999999999?

Responder:

  1. 2147483647 es 2038 (no 9999999999) por lo que no hay problema.
  2. unsigned no es necesario ya que 2147483647 encaja perfectamente en un int firmado de MySQL.

Las marcas de tiempo UNIX estándar son un entero de 32 bits con signo, que en MySQL es una columna "int" regular. No hay forma de que pueda almacenar 9.999.999.999, ya que está fuera del rango de representación, la más alta de 32 bits de cualquier tipo puede ser 4.294.967.295. El más alto de 32 bits firmado va es 2.147.483.647.

Si / cuando las marcas de tiempo de UNIX van a un tipo de datos de 64 bits, entonces tendrá que usar un "bigint" de MySQL para almacenarlos.

En cuanto a int(10) , la porción (10) es meramente para propósitos de visualización. MySQL aún usará un total de 32 bits internamente para almacenar el número, pero solo mostrará 10 cada vez que selecciones la tabla.