2011-12-08 42 views
7

Tôi có một vấn đề lạ liên quan đến múi giờ mysql.Cách đặt chính xác múi giờ mysql

Trong tập tin cấu hình trang web của tôi có dòng này mà đặt múi giờ:

mysql_query("SET SESSION time_zone = '$offset';"); // Offset is properly calculated, no worries about that 

Phần buồn cười là nếu tôi thêm một dòng khác ngay sau này như thế này:

$q = mysql_query("SELECT NOW() as now"); 
$row = mysql_fetch_array($row); 
echo $row["now"]; 

Sau khi thực hiện mã đó, thời gian được hiển thị chính xác.

NHƯNG, trong một số truy vấn khác, tôi chèn hàng vào bảng có cột được đặt tên ngày mặc định là CURRENT_TIMESTAMP.

dòng được chèn vào như thế này:

INSERT INTO `sessions` (`user_id`) VALUES `1` 

(Bảng phiên có một cột date rằng mặc định là CURRENT_TIMESTAMP)

Nhưng giá trị chèn vào DB vẫn chỉ trở lại múi giờ của máy chủ: ((

Bất kỳ ý tưởng nào về cách thực hiện điều này?

+0

Khi bạn nói các giá trị được chèn vào điểm DB trở lại múi giờ của máy chủ, bạn kiểm tra như thế nào? Ngoài ra, mặc dù kết nối mà bạn đã thực hiện thủ thuật 'SET SESSION time_zone'? – Romain

+0

là bạn đóng kết nối trước khi chạy 'INSERT'? – ManseUK

+0

Tôi đang kiểm tra nó trên phpMyAdmin, và kết nối không được đóng lại cho đến khi kết thúc việc thực thi tập lệnh –

Trả lời

19

Bạn phải hiểu rằng MySQL duy trì nhiều ti tôi thiết lập khu vực: múi giờ

  • hệ thống (về cơ bản là thiết lập múi giờ trong OS) Khu
  • máy chủ thời gian (múi giờ được sử dụng bởi MySQL)
  • múi giờ khách hàng (múi giờ phiên sử dụng cho mỗi kết nối)

Xem chi tiết http://dev.mysql.com/doc/refman/5.5/en/time-zone-support.html.

ngày giá trị/thời gian được lưu trữ trong hai cách khác nhau: giá trị dựa

  • Tất cả unix timestamp luôn lưu giữ trong UTC. Chúng được chuyển đổi nội bộ từ và sang múi giờ của Khách hàng khi chúng được lưu trữ và đọc. Điều này cũng đúng với các hàm NOW() và CURTIME() vì chúng là dấu thời gian dựa trên.
  • cột DATE, TIME và DATETIME (lưu trữ giá trị của chúng theo định dạng giờ-phút-giây hàng năm) không bị ảnh hưởng bởi cài đặt múi giờ và không bao giờ được chuyển đổi.

Từ trên nó sẽ trở nên rõ ràng rằng các giá trị mà bạn nhìn thấy khi bạn đọc từ cột dấu thời gian unix dựa trên không nhất thiết những gì thực sự được lưu trữ trong DB. Chúng được chuyển đổi bằng múi giờ của máy chủ và múi giờ của khách hàng. Kết quả có thể gây nhầm lẫn nếu bạn không hiểu chi tiết về cơ chế.

Đối với một thử nghiệm đầu tiên cố gắng tìm hiểu các thiết lập hiện tại trong mỗi người trong số các chương trình khách hàng của bạn bằng cách thực hiện

SELECT @@global.time_zone, @@session.time_zone; 

Các múi giờ toàn cầu sẽ luôn là như vậy. Nhưng múi giờ của phiên có thể khác với ứng dụng khách cho ứng dụng khách và sẽ thay đổi kết quả của các hoạt động đọc và ghi của bạn.

+2

Cảm ơn, rất khai sáng thực sự! Tôi nhận ra rằng phpMyAdmin đang hiển thị thời gian được chuyển đổi sang múi giờ của máy chủ, nhưng nếu tôi đọc chúng từ DB trong tập lệnh của tôi sau khi đặt múi giờ phiên, chúng xuất hiện chính xác vì vậy nó chỉ là phpMyAdmin gây nhầm lẫn cho tôi :) –

+0

@DanyKhalife Cảm ơn bạn đã bình luận về điều này , nghĩ rằng tôi đã phát điên. – Mark

+0

@Jpsy Greate answer..i có truy vấn làm thế nào để bạn đặt múi giờ của khách hàng trong tệp confsq mysql ??? – goodyzain

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