MySQL中的INT
和DATETIME
是两种常用的数据类型。
TINYINT
:1字节,范围-128到127(有符号),或0到255(无符号)。SMALLINT
:2字节,范围-32768到32767(有符号),或0到65535(无符号)。MEDIUMINT
:3字节,范围-8388608到8388607(有符号),或0到16777215(无符号)。INT
:4字节,范围-2147483648到2147483647(有符号),或0到4294967295(无符号)。BIGINT
:8字节,范围-9223372036854775808到9223372036854775807(有符号),或0到18446744073709551615(无符号)。DATE
:仅存储日期,范围1000-01-01到9999-12-31。TIME
:仅存储时间,范围'-838:59:59'到'838:59:59'。DATETIME
:存储日期和时间,范围1000-01-01 00:00:00到9999-12-31 23:59:59。TIMESTAMP
:存储日期和时间,范围1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC。原因:使用INT存储时间戳可以节省存储空间,并且查询速度较快。
解决方法:
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
timestamp INT
);
INSERT INTO example (timestamp) VALUES (UNIX_TIMESTAMP());
SELECT FROM_UNIXTIME(timestamp) AS datetime FROM example;
原因:DATETIME类型可以直接存储和显示日期和时间,便于用户阅读和理解。
解决方法:
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
datetime DATETIME
);
INSERT INTO example (datetime) VALUES (NOW());
SELECT datetime FROM example;
原因:MySQL的DATETIME类型不包含时区信息,可能会导致时区不一致的问题。
解决方法:
TIMESTAMP
类型,它会自动转换为UTC时间存储,并在查询时转换为当前时区。CONVERT_TZ()
。-- 使用TIMESTAMP类型
CREATE TABLE example (
id INT AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
-- 手动处理时区转换
SELECT CONVERT_TZ(datetime, '+00:00', '+08:00') AS local_datetime FROM example;
领取专属 10元无门槛券
手把手带您无忧上云