web-dev-qa-db-fra.com

Utiliser TIMESTAMP de MySQL vs stocker directement des horodatages

Je suis dans un dilemme concernant la sauvegarde des valeurs de date et d'heure au format TIMESTAMP de MySQL vs dans un format UNSIGNED INT personnalisé. Les principales considérations ici sont la vitesse de récupération, les calculs de plage appropriés en PHP et le formatage occasionnel en valeurs lisibles par l'homme.

L'espace de stockage requis pour chaque type et leurs gammes:

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)

Je n'ai pas du tout besoin de la gamme DATETIME. Je suis déchiré entre TIMESTAMP et UNSIGNED INT.

Arguments en faveur d'UNSIGNED INT:

  • Un horodatage UNIX de 4294967295 se convertit en Sun, 07 Feb 2106 06:28:15 GMT qui est plus que TIMESTAMP et assez bon pour moi
  • Comparer ces horodatages directement dans PHP serait plus rapide que de convertir des horodatages via strtotime (), puis de les comparer

Le seul avantage que TIMESTAMP me donnerait, c'est lorsque je lis manuellement les valeurs de la table mysql et que je dois les "voir".

Y a-t-il une raison impérieuse d'utiliser TIMESTAMP et non un UNSIGNED INT?

37
siliconpi

Arguments pour TIMESTAMP

  • Il stocke implicitement les données dans le fuseau horaire UTC. Quel que soit le fuseau horaire de votre session. Utile si vous devez utiliser différents fuseaux horaires.
  • Vous pouvez avoir des colonnes d'horodatage automatisées en utilisant DEFAULT CURRENT_TIMESTAMP Ou ON UPDATE CURRENT_TIMESTAMP (Une colonne par table uniquement jusqu'à MySQL 5.6.5)
  • Vous pouvez utiliser la fonction datetime pour la comparaison de date, l'addition, la soustraction, la recherche de plage, etc., sans avoir besoin d'utiliser la fonction FROM_UNIXTIME() - cela facilitera l'écriture de requêtes pouvant utiliser des index
  • En PHP

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

    donc la gamme est en fait la même

Lorsque UNIX_TIMESTAMP () est utilisé sur une colonne TIMESTAMP, la fonction renvoie directement la valeur d'horodatage interne, sans conversion implicite de "chaîne en horodatage Unix"

28
Mchl

La seule utilisation réelle de TIMESTAMP est lorsque vous souhaitez que ce champ soit mis à jour automatiquement lorsque la ligne est mise à jour (ce qui est le comportement par défaut pour ce champ), ou lorsque les exigences de stockage de données sont si strictes que 4 octets par ligne font vraiment une différence pour tu.

Vraiment, la comparaison devrait être entre DATETIME et UNSIGNED INT, et je recommanderais DATETIME parce que:

  • Vous pouvez utiliser les fonctions natives date/heure de MySQL pour sélectionner par plages de dates, etc.
  • Il est très simple de sélectionner ces dates comme horodatages UNIX pour un formatage facile en PHP: SELECT UNIX_TIMESTAMP(field) FROM table, pas besoin de sélectionner la valeur brute et d'utiliser strtotime
  • Plus facile à lire et à modifier les champs de votre base de données directement si vous en avez besoin (comme vous l'avez souligné).
  • Aucune limite sur la plage de dates

Le point deux à lui seul supprime vraiment toute raison de stocker des nombres entiers, à mon avis.

9
Tim Fountain

Ce n'est peut-être pas une réponse "scientifique" mais je trouve toujours la façon dont MySql gère la conversion, l'arithmétique, la comparaison, etc ... sur les colonnes TIMESTAMP déroutante. Une colonne UNSIGNED INT est beaucoup plus simple et je sais toujours à quoi m'attendre.

P.S. Peut-être une autre chose en faveur de la colonne TIMESTAMP est sa capacité à être automatiquement réglée sur l'heure actuelle après chaque mise à jour ou insertion, mais ce n'est pas quelque chose dont vous ne pouvez pas vous passer.

3
nobody