Theo mặc định, (ít nhất là trên các bản cài đặt dựa trên Debian) không có dữ liệu múi giờ nào được tải vào MySQL. Nếu bạn muốn kiểm tra xem chúng đã được tải chưa, hãy thử thực hiện:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
Nếu nó trả về DATETIME
(trong trường hợp này là 2012-06-07 08:00:00
), bạn đã tải các múi giờ. Nếu nó trả về NULL
, họ không. Khi không được tải, bạn bị giới hạn chuyển đổi bằng cách sử dụng các hiệu số (ví dụ:+10:00
hoặc -6:00
).
Điều này sẽ hoạt động tốt trong nhiều trường hợp, nhưng có những lúc tốt hơn là sử dụng các múi giờ được đặt tên, như để không lo lắng về thời gian tiết kiệm ánh sáng ban ngày. Việc thực thi lệnh sau sẽ tải dữ liệu múi giờ từ hệ thống (chỉ dành cho Unix. Tôi không chắc lệnh Windows tương đương sẽ là gì):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
Nếu bạn cần liên tục dựa vào múi giờ MySQL, lệnh trên phải được thực thi mỗi khi cập nhật múi giờ hệ thống . Bạn cũng có thể thêm nó vào công việc cron hàng tuần hoặc hàng tháng để tự động làm việc đó cho bạn.
Sau đó, để xem danh sách múi giờ, chỉ cần thực hiện như sau:
USE mysql;
SELECT * FROM `time_zone_name`;
Lưu ý, thông tin múi giờ chiếm khoảng 5 MB trong MySQL. Nếu bạn muốn hủy tải thông tin múi giờ, chỉ cần thực hiện như sau và khởi động lại MySQL:
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
Không DROP
những bảng này hoặc những điều tồi tệ sẽ xảy ra.
Chỉnh sửa:
Dựa trên nhận xét của người dùng bên dưới, nếu bạn muốn múi giờ tự động được cập nhật khi cập nhật hệ thống, trước tiên bạn cần cho phép root đăng nhập mà không được nhắc nhập mật khẩu.
MySQL> =5.6.6
Thực thi [ nguồn sau ]:
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
Tạo ~/.my.cnf
tệp (nếu nó chưa tồn tại) và thêm những thứ sau:
[client]
user=root
password=yourMysqlRootPW
Sau đó thực thi chmod 600 ~/.my.cnf
để đảm bảo không ai khác có thể đọc nó.
Cập nhật tập lệnh
Thêm tập lệnh sau vào crontab để được thực thi một lần mỗi ngày:
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24
# hours and do not have ".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
echo "Updating MySQL timezone info"
# Note, suppressing STDERR here because of the .tab files above
# that cause warnings.
mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
echo "Done!\n"
fi
Xóa echo
nếu bạn không muốn bất kỳ đầu ra nào.
Lưu ý:Đây là (hầu hết) chưa được kiểm tra. Hãy cho tôi biết nếu bạn có bất kỳ vấn đề nào và tôi sẽ cập nhật câu trả lời này.