2011-08-11 25 views
30

Tôi đang gặp khó khăn về việc lưu các giá trị ngày và thời gian trong định dạng TIMESTAMP của MySQL so với định dạng INTSIGNED INT tùy chỉnh. Những cân nhắc chính ở đây là tốc độ truy xuất, tính toán phạm vi thích hợp trong PHP và định dạng không thường xuyên vào các giá trị có thể đọc được của con người.Sử dụng TIMESTAMP của MySQL và lưu trữ dấu thời gian trực tiếp

Không gian lưu trữ cần thiết đối với từng loại và phạm vi của họ:

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) 

Tôi không cần một loạt các DATETIME ở tất cả. Tôi bị rách giữa TIMESTAMP và UNSIGNED INT.

luận cứ ủng hộ unsigned int:

  • Một UNIX timestamp của 4294967295 cải để Sun, ngày 07 Tháng Hai 2106 06:28:15 GMT mà là nhiều hơn dấu thời gian và đủ tốt cho tôi
  • So sánh các dấu thời gian trực tiếp trong PHP sẽ nhanh hơn thay vì chuyển đổi TIMESTAMPs qua strtotime() và sau đó so sánh chúng

Lợi thế duy nhất TIMESTAMP sẽ cho tôi khi tôi đọc các giá trị từ bảng mysql theo cách thủ công và cần phải ' nhìn thấy chúng.

Có lý do thuyết phục nào để sử dụng TIMESTAMP và không phải là UNSIGNED INT không?

+0

Xem liên quan: [datetime vs timestamp?] (Http://stackoverflow.com/questions/409286/datetime-vs-timestamp) – JYelton

+0

Dấu thời gian 32 bit sẽ chỉ xuất hiện cho đến tháng 1 năm 2038 và nhiều thư viện vẫn đang sử dụng 32 bit time_t thay vì 64bit, vì vậy bạn có thể gặp phải sự cố về tính di động. Bên trong, PHP lưu trữ các dấu thời gian/datetime ở định dạng số anyways, và chỉ chuyển đổi thành các chuỗi kiểu yyyy-mm-dd tốt đẹp khi truy xuất. –

Trả lời

20

luận cứ cho dấu thời gian

  • Nó ngầm lưu trữ dữ liệu theo múi giờ GMT. Bất kể múi giờ phiên của bạn là gì. Hữu ích nếu bạn cần sử dụng múi giờ khác nhau.
  • cột timestamping Bạn có thể đã tự động sử dụng DEFAULT CURRENT_TIMESTAMP hoặc ON UPDATE CURRENT_TIMESTAMP (một cột cho mỗi bảng chỉ cho đến khi MySQL 5.6.5)
  • Bạn có thể sử dụng chức năng datetime cho ngày so sánh, bổ sung, trừ, phạm vi tra cứu vv, mà không cần phải sử dụng FROM_UNIXTIME() chức năng - nó sẽ làm cho nó dễ dàng hơn để viết các truy vấn có thể sử dụng chỉ số
  • trong PHP

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

    nên dãy núi này là trong thực tế cùng

Khi UNIX_TIMESTAMP() được sử dụng trên một cột dấu thời gian, chức năng trả về nội giá trị dấu thời gian trực tiếp, không có ngụ ý chuyển đổi “chuỗi-sang-Unix-dấu thời gian” ẩn

+1

'echo date ('Y-m-d h: i: s', 4294967295);' cho tôi cung cấp cho 2106-02-07 06:28:15 - bạn đang sử dụng hệ điều hành 32 bit? –

+1

Không, đó là một Windows 64b, nhưng tôi nghĩ rằng tôi có một 32b PHP chạy. Đó là soomething bạn cần phải đưa vào tài khoản nếu bạn muốn ứng dụng của bạn được di động. Nếu bạn sẽ có sự kiểm soát trên môi trường sản xuất, sau đó nevermind. – Mchl

+2

Đối với viên đạn thứ hai của bạn, chỉ có một cột có thể được thực hiện DEFAULT CURRENT_TIMESTAMP hoặc ON UPDATE CURRENT_TIMESTAMP, như đã chỉ ra ở đây (ít nhất là trên MySQL v5.1): http://dev.mysql.com/doc/refman/5.1/ vi/timestamp-initialization.html –

2

Đây có thể không phải là "khoa học" một nswer nhưng tôi luôn luôn tìm cách MySql xử lý chuyển đổi, arithmetics, comparsion, vv ... trên TIMESTAMP cột khó hiểu. Một cột UNSIGNED INT thẳng tiến hơn nhiều và tôi luôn biết điều gì sẽ xảy ra.

P.S.Có lẽ một điều khác có lợi cho cột TIMESTAMP là khả năng tự động được đặt thành thời gian hiện tại sau mỗi lần cập nhật hoặc chèn nhưng đó không phải là thứ bạn không thể sống thiếu.

8

Việc sử dụng thực sự duy nhất cho TIMESTAMP là khi bạn muốn trường được cập nhật tự động khi hàng được cập nhật (là hành vi mặc định cho trường đó) hoặc khi yêu cầu lưu trữ dữ liệu quá nghiêm ngặt đến mức 4 byte mỗi hàng tạo sự khác biệt cho bạn.

Thật sự so sánh nên được giữa DATETIME và unsigned int, và tôi khuyên bạn nên DATETIME vì:

  • Bạn có thể sử dụng chức năng ngày/giờ mẹ đẻ của MySQL để lựa chọn bởi các dãy ngày, vv
  • Đó là dễ dàng để chọn những ngày này dưới dạng dấu thời gian UNIX để dễ định dạng trong PHP: SELECT UNIX_TIMESTAMP(field) FROM table, không cần chọn giá trị thô và sử dụng strtotime
  • Dễ dàng đọc và chỉnh sửa các trường trong cơ sở dữ liệu của bạn trực tiếp nếu bạn cần (như bạn chỉ ra).
  • Không giới hạn về phạm vi ngày

Point hai một mình thực sự loại bỏ vì lý do nào để lưu trữ trong các số nguyên, theo ý kiến ​​của tôi.

+1

Nhược điểm cho DATETIME là nó không lưu trữ bù đắp GMT trong trường. Bạn cần phải chuyển đổi mọi thứ trước khi lưu trữ sang GMT (hoặc bất cứ điều gì bạn muốn thời gian 'zulu' của bạn được) và sau đó chuyển đổi nó trở lại nếu bạn đang đối phó với nhiều múi giờ. Lưu trữ trong INT loại bỏ một số yêu cầu này. – ashurexm

+0

Một ưu điểm cho DATETIME là tôi lười và nó hoạt động khá tốt cho một miền địa phương/múi giờ. – ashurexm

+0

Cảm ơn nhận xét về 'UNIX_TIMESTAMP' - Tôi không biết điều này trước đây. –

Các vấn đề liên quan