MySQL tarih veya PHP?

7 Cevap php

Ben genellikle PHP'nin time() fonksiyon MySQL veritabanı yerine ben geri çekin zaman işlemek için kolay çünkü MySQL'in tarih biçimini kullanarak kullanarak tamsayılar olarak tarihlerini depolamak, ama bu herhangi bir dezavantajları vardır?

7 Cevap

Range:

Belirgin dezavantajı, her zaman var:. Saklayabilirsiniz aralığı 1970-2038 från sınırlıdır, bu aralığın dışındaki tarihleri ​​saklamak gerekiyorsa, genellikle başka bir biçimi kullanmak gerekir. Bu uygulamak buldum en yaygın durum birthdates etmektir.

Readability:

Bence insanların verileri yorumlamak kolay olduğunu yerleşik tarih tiplerinin o birini kullanmayı seçtik en önemli nedeni. Sen basit bir seçme yapmak ve daha fazla tepki biçimlendirmek zorunda kalmadan değerleri anlayabiliyorum.

Indexes:

Tarih türlerini kullanmak için iyi bir teknik nedeni unix damgaları değil bazı durumlarda endeksli sorgu için izin vermesidir. Aşağıdaki sorgu düşünün:

SELECT * FROM tbl WHERE year(mydate_field) = 2009;

Mydate_field yerel tarih türü olup, alanında bir dizin varsa, bu sorgu aslında işlev çağrısına rağmen, bir dizin kullanır. Bu hemen hemen mysql bu gibi alanlarda fonksiyon çağrıları optimize edebilirsiniz tek zamandır. Bir zaman damgası alanda ilgili sorgu endeksleri kullanmak mümkün olmayacaktır:

SELECT * FROM tbl WHERE year(from_unixtime(mytimestamp_field)) = 2009;

Eğer biraz düşünürseniz, onun etrafında bir yol olsa da, var. Bu sorgu aynı şeyi yapar, ve will endeksi optimizasyonlar kullanmak mümkün:

SELECT * FROM tbl WHERE mytimestamp_field > unix_timestamp("2009-01-01") AND mytimestamp_field < unix_timestamp("2010-01-01");

Calculations:

Genel olarak, ben dezavantajları rağmen, unix zaman olarak tarihlerini depolamak. Bu gerçekten liyakatına dayalı, ama ben buna alışkınım çünkü doğrusu bu kadar değil. Bu bazı hesaplamaları kolaylaştıran bulundu, ama diğerleri zorlaştırıyor ettik. Örneğin, ayda saniye sayısı değişir beri unix timestamp bir ay eklemek için çok zor. Bu mysql DATE_ADD () işlevini kullanarak çok kolay. Ancak, çoğu durumda aslında hesaplamaları kolaylaştıran düşünüyorum. Örneğin, bu son iki gün, diyelim ki, mesajları seçmek istediğiniz oldukça yaygındır. Alan bir unix zaman damgası varsa bu sadece yaparak kolayca yapılabilir:

SELECT * FROM tbl WHERE mytimestamp_field > time() - 2*24*3600;

Muhtemelen bir tat meselesi, ama ben şahsen böyle DATE_SUB () gibi bir işlev sözdizimi rember zorunda daha bu hızlı ve kolay bulabilirsiniz.

Timezones:

Unix damgaları zaman dilimi veri depolamak olamaz. Ben tek bir dilimini var isveç'te yaşıyor, bu gerçekten benim için bir sorun değildir. Birden saat dilimlerini kapsayan bir ülkede yaşıyorsanız Ancak, bu büyük bir ağrı olabilir.

Bu veritabanındaki ham verilere bakarken ben kolayca yorumlamak anlamına gelir çünkü - Ben aynı yapmak için kullanılan, ama şimdi ben bir MySQL DateTime olarak saklayın.

Bunun dışında, bu kadar ağır (PHP gibi) UNIX zaman damgası kullanmayın, diğer diller ile verilerle çalışmak için belki daha kolay, ama her iki durumda da gerçekten büyük bir çekme yok.

UNIX zaman damgası depolamak mümkün olacaktır tarih aralığı olarak bariz sınırlamaları vardır.

Ben de her zaman şimdi DATETIME alanları kullanın. Eğer hiç bir PHP kullanmadan DATEDIFF şimdi ve bir saklı tarih arasındaki gibi yararlı bilgiler çekin böylece SQL kullanarak TARIH matematik bir sürü yapabilirsiniz.

Pek çok dezavantajları bulunmaktadır:

  • Hassasiyet eksikliği; Tipik 32-bit tamsayı kullanırken Unix zaman saniye ve sadece 1901/12/13 ve 2038/01/19 arasındaki tarihler için sadece doğru
  • Siz verileri sorgulamak veya işlemek için herhangi bir yerleşik veritabanı fonksiyonları kullanamazsınız
  • Bir timezone saklayamazsınız

Kodda birine dönüştürmek için time_t, bu kolay yeterli gerekir.

Detay hafif bir kayıp. MySQL Datetime değişken çok hassas olabilir.

Edeceksin eğer Ayrıca, veritabanında tarihleri ​​karşılaştırmak zorunda, tarih biçimi işlevleri bazı yerleşik kullanmak mümkün olmayacaktır gelmiştir.

Ben ölçeklenebilirlik nedenleriyle için Unix zaman damgalarını kullanmak için daha iyi olduğunu düşünüyorum.

Advantages:

  • Her zaman (Birden çok zaman dilimleri arasında sunucular varsa, hiçbir dönüşüm tabi) UTC timezone saklanır.
  • Uygulamalar (Bu olası son düzeyinde, sadece bir kez gerçekleşir) tercih timezone çevirebiliriz.
  • Değil dizeleri (bu tamsayılar ile karşılaştırıldığında çok büyük).
  • (created <19345345345-24 * 60 * 60 kez hesaplanır Stuff gibi) az veritabanı hesapları.

EDIT: MySQL Timestamps are not stored internally as strings, but when pulled out of the database those are converted to strings. DATETIME type is not modified by MySQL, meaning that if you put a date in the database you get the same.

If you have visitors on a website from a different timezone you would have to convert dates like string->string instead of integer->string). In some countries dates are not just numbers(For example in France it is Mardi 15 mai 2012 I prefer doing that in PHP or JS. I think that a simpe convertion integer->string is faster than Integer->String->String. Plus no headache if migrating to servers in other country.

Fake disadvantages:

  • Ben Unix zaman pul sınırlı aralığı aslında sınırlı olmadığına inanıyorum. Bir zaman damgası veritabanında bir tamsayı, yani boyutunu ayarlayabilirsiniz. Varsayılan olarak, bir unsigned tamsayı int(10) Eğer 4294967295 kadar numaralarını saklayabileceğiniz anlamına olduğunu, ama biz kolayca [{ değiştirebilirsiniz sınırları sabit değildir bulunuyor (1)]} int ile int(16) bigint

Bu çok kötü değil ama sen gibi işlevselliği yerleşik bazı kaybetme olacak:

tablo1 dateColumn = getDate () -30 seçin *

Eğer datetime kullanın!