Rumah > Artikel > pangkalan data > Bagaimana untuk menyimpan masa dalam pangkalan data MySQL
Rentetan mengambil lebih banyak ruang!
Kecekapan perbandingan tarikh storan rentetan adalah agak rendah (perbandingan aksara mengikut aksara), dan tidak boleh dikira dan dibandingkan menggunakan API berkaitan tarikh.
Datetime dan Timestamp ialah dua jenis data yang serupa untuk menyimpan masa yang disediakan oleh MySQL.
Bagaimana untuk memilih antara mereka?
Biasanya kami lebih suka Cap Waktu
Jenis DateTime tidak mempunyai maklumat zon waktu (zon masa tidak relevan)
Bila anda Selepas zon waktu ditukar, sebagai contoh, jika pelayan anda menukar alamatnya atau menukar tetapan zon masa sambungan klien, ia akan menyebabkan masa anda membaca daripada pangkalan data menjadi tidak betul.
Cap masa berkaitan dengan zon waktu.
Nilai medan jenis Cap Masa akan berubah dengan perubahan zon waktu pelayan dan akan ditukar secara automatik kepada masa yang sepadan Secara ringkasnya, dalam zon waktu yang berbeza, nilai medan ini adalah berbeza untuk rekod yang sama ditanya.
Mari berikan demonstrasi praktikal di bawah!
Buat pernyataan SQL jadual:
CREATE TABLE `time_zone_test` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `date_time` datetime DEFAULT NULL, `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Sisipkan data:
INSERT INTO time_zone_test(date_time,time_stamp) VALUES(NOW(),NOW());
Lihat data:
select dsqlate_time,time_stamp from time_zone_test;
Hasil:
+----------------------+---------------------+
Ubah suai zon waktu sesi semasa :
|. tarikh_masa 11 09:53:32 |
+-------------- ------+-----------------------+
set time_zone='+8:00';
sekali lagi Lihat data:
+----------------------+------ ------- ------+|. cap_masa |+---------------------+--. ------- ------------+
Sambungan : Beberapa perintah sql biasa tentang tetapan zon waktu MySQL
| 2020-01-11 09:53:32 | ------- -------------+---------------------+
1 Lihat zon waktu sesi semasa
SELECT @@session.time_zone;2 >
SET time_zone = 'Europe/Helsinki'; SET time_zone = "+00:00";
3. Tetapan zon waktu global pangkalan data
SELECT @@global.time_zone;
4 Menetapkan zon waktu global
SET GLOBAL time_zone = '+8:00'; SET GLOBAL time_zone = 'Europe/Helsinki';
2.2 Jenis DateTime menggunakan lebih banyak ruang
Cap masa hanya perlu menggunakan 4. bait ruang storan, tetapi DateTime memerlukan lebih banyak ruang 8 bait ruang storan. Walau bagaimanapun, pendekatan ini juga menimbulkan isu bahawa Cap Waktu mempunyai julat masa yang lebih terhad.
:1000-01-01 00:00:00 ~ 9999-12-31 23:59:59DateTime
Timestamp
Timestamp mempunyai perbezaan yang ketara dalam versi MySQL yang berbeza.
Rajah berikut menunjukkan ruang storan yang diduduki oleh jenis tarikh dalam versi MySQL 5.6:
Dapat dilihat bahawa MySQL selepas 5.6.4 mempunyai tempat perpuluhan tambahan yang memerlukan 0 hingga 3 bait. DataTime dan Timestamp akan menduduki ruang storan yang berbeza apabila disimpan.Untuk kemudahan, dalam artikel ini kami masih lalai bahawa Cap Waktu hanya memerlukan 4 bait ruang storan, tetapi DateTime memerlukan 8 bait ruang storan.
4. Adakah cap waktu angka merupakan pilihan yang lebih baik?
Banyak kali, kami juga menggunakan nilai jenis int atau bigint, iaitu cap masa, untuk mewakili masa.
Takrif cap masa bermula dari masa asas, iaitu "1970-1-1 00: 00:00 +0:00", bermula dari masa ini, dinyatakan sebagai integer, diukur dalam saat, kali ini integer terus meningkat seiring dengan berlalunya masa. Dengan cara ini, saya hanya memerlukan satu nilai untuk mewakili masa dengan sempurna, dan nilai ini adalah nilai mutlak, iaitu, tidak kira di mana anda berada di mana-mana sudut bumi, cap masa yang mewakili masa adalah sama, dijana Nilai-nilai semuanya sama, dan tiada konsep zon waktu, jadi tiada penukaran tambahan diperlukan semasa penghantaran masa dalam sistem Ia hanya ditukar kepada waktu tempatan dalam format rentetan apabila dipaparkan kepada pengguna.
Operasi sebenar dalam pangkalan data:mysql> select UNIX_TIMESTAMP('2020-01-11 09:53:32'); +---------------------------------------+ | UNIX_TIMESTAMP('2020-01-11 09:53:32') | +---------------------------------------+ | 1578707612 | +---------------------------------------+ 1 row in set (0.00 sec) mysql> select FROM_UNIXTIME(1578707612); +---------------------------+ | FROM_UNIXTIME(1578707612) | +---------------------------+ | 2020-01-11 09:53:32 | +---------------------------+ 1 row in set (0.01 sec)5 Ringkasan
Cap masa disyorkan kerana perwakilan berangka masa tidak cukup intuitif
[mysqld] sql-mode=STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
Atas ialah kandungan terperinci Bagaimana untuk menyimpan masa dalam pangkalan data MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!