Bunu bir topluluk wiki olarak işaretledim, bu yüzden boş zamanlarınızda düzenlemekten çekinmeyin.
2038 yılı sorunu tam olarak nedir?
"2038 yılı sorunu (Y2K sorununa benzer şekilde Unix Millennium Bug, Y2K38 olarak da bilinir) bazı bilgisayar yazılımlarının 2038'den önce veya 2038 yılında başarısız olmasına neden olabilir. Sorun, sistem zamanını imzalı 32 olarak depolayan tüm yazılımları ve sistemleri etkiler. -bit tamsayı ve bu sayıyı 1 Ocak 1970 00:00:00 UTC'den bu yana geçen saniye sayısı olarak yorumlayın. "
Neden oluyor ve gerçekleştiğinde ne oluyor?
19 Ocak 2038 Salı günü 03:14:07 UTC'yi aşan zamanlar , bu sistemlerin 2038'den ziyade 13 Aralık 1901'deki bir zaman olarak yorumlayacağı negatif bir sayı olarak 'çevrilecek' ve dahili olarak depolanacaktır. UNIX döneminden (1 Ocak 1970 00:00:00 GMT) bu yana geçen saniye sayısının, bir bilgisayarın 32 bitlik işaretli bir tamsayı için maksimum değerini aşmış olacağı gerçeği.
Nasıl çözeriz?
- Uzun veri türlerini kullanın (64 bit yeterlidir)
- MySQL (veya MariaDB) için, zaman bilgisine ihtiyacınız yoksa,
DATE
sütun türünü kullanmayı düşünün . Daha yüksek doğruluğa ihtiyacınız varsa, DATETIME
yerine kullanın TIMESTAMP
. DATETIME
Sütunların saat dilimi hakkında bilgi depolamadığına dikkat edin , bu nedenle uygulamanızın hangi saat diliminin kullanıldığını bilmesi gerekir.
- Wikipedia'da açıklanan diğer olası çözümler
- MySQL geliştiricilerinin on yıldan uzun bir süre önce bildirilen bu hatayı düzeltmesini bekleyin .
Kullanmanın benzer bir problem oluşturmayan olası alternatifleri var mı?
Veri tabanlarında tarih depolamak için mümkün olan her yerde büyük türleri kullanmayı deneyin: 64 bit yeterlidir - GNU C ve POSIX / sprintf('%u'...)
SuS'de veya PHP'de veya BCmath uzantısında uzun uzun bir tür .
Henüz 2038'de olmamamıza rağmen, potansiyel olarak kırılma olasılığı olan kullanım örnekleri nelerdir?
Yani bir MySQL DATETIME 1000-9999 aralığına sahiptir, ancak TIMESTAMP yalnızca 1970-2038 aralığına sahiptir. Sisteminiz doğum tarihlerini, gelecekteki ileriye dönük tarihleri (örneğin 30 yıllık ipotekler) veya benzerlerini saklarsa, bu hatayla zaten karşılaşacaksınız. Yine, bu bir sorun olacaksa TIMESTAMP'ı kullanmayın.
Gerçekten ortaya çıktığında, sözde sorunu önlemek için TIMESTAMP kullanan mevcut uygulamalara ne yapabiliriz?
2038'de az sayıda PHP uygulaması hala mevcut olacak, ancak web'in henüz eski bir platform olmadığını tahmin etmek zor.
İşte bir veritabanı tablosu sütununu dönüştürmek TIMESTAMP
için bir işlem DATETIME
. Geçici bir sütun oluşturmakla başlar:
# rename the old TIMESTAMP field
ALTER TABLE `myTable` CHANGE `myTimestamp` `temp_myTimestamp` int(11) NOT NULL;
# create a new DATETIME column of the same name as your old column
ALTER TABLE `myTable` ADD `myTimestamp` DATETIME NOT NULL;
# update all rows by populating your new DATETIME field
UPDATE `myTable` SET `myTimestamp` = FROM_UNIXTIME(temp_myTimestamp);
# remove the temporary column
ALTER TABLE `myTable` DROP `temp_myTimestamp`
kaynaklar