MYSQL中TIMESTAMP类型

本文详细介绍了MySQL中TIMESTAMP类型的使用方法,包括如何设定默认值为当前时间,并探讨了不同情况下TIMESTAMP字段的行为变化,同时提供了避免字段冲突的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MYSQL中TIMESTAMP类型的默认值
  
MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样。
1、自动UPDATE 和INSERT 到当前的时间:
表:
---------------------------------
Table   Create Table                                                                        
------  -------------------------------------------------------------------------------------
t1      CREATE TABLE `t1` (                                                                 
          `p_c` int(11) NOT NULL,                                                           
          `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 
        ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                                              

数据:
1    2007-10-08 11:53:35
2    2007-10-08 11:54:00
insert into t1(p_c) select 3;
update t1 set p_c = 2 where p_c = 5;
数据:
1    2007-10-08 11:53:35
5    2007-10-08 12:00:37
3    2007-10-08 12:00:37
 
 
2、自动INSERT 到当前时间,不过不自动UPDATE。
表:
---------------------------------
Table   Create Table                                            
------  ---------------------------------------------------------
t1      CREATE TABLE `t2` (                                     
          `p_c` int(11) NOT NULL,                               
          `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 
        ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                  
数据:
insert into t2(p_c) select 4;
update t2 set p_c = 3 where p_c = 5;
1    2007-10-08 11:53:35
2    2007-10-08 12:00:37
5    2007-10-08 12:00:37
4    2007-10-08 12:05:19
 

3、一个表中不能有两个字段默认值是当前时间,否则就会出错。不过其他的可以。
表:
---------------------------------
Table   Create Table                                                  
------  ---------------------------------------------------------------
t1      CREATE TABLE `t1` (                                           
          `p_c` int(11) NOT NULL,                                     
          `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,      
          `p_timew2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 
        ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                        
数据:
1    2007-10-08 11:53:35    0000-00-00 00:00:00
2    2007-10-08 12:00:37    0000-00-00 00:00:00
3    2007-10-08 12:00:37    0000-00-00 00:00:00
4    2007-10-08 12:05:19    0000-00-00 00:00:00


TIMESTAMP的变体
1,TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在创建新记录和修改现有记录的时候都对这个数据列刷新

2,TIMESTAMP DEFAULT CURRENT_TIMESTAMP
在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它

3,TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
在创建新记录的时候把这个字段设置为0,以后修改时刷新它

4,TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP
在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它

 
一般在数据库结构设计中,用datetime替换timestamp字段,用程序来实现时间的创建和修改,这样可以控制的更加准确,好处是,不至于你修改该表的任何数据,此时间会随之改变。

由于MySQL目前字段的默认值不支持函数,所以以

create_time datetime default now()

的形式设置默认值是不可能的。

代替的方案是使用TIMESTAMP类型代替DATETIME类型。

TIMESTAMP列类型自动地用当前的日期和时间标记INSERT或UPDATE的操作。
如果有多个TIMESTAMP列,只有第一个自动更新。
自动更新第一个TIMESTAMP列在下列任何条件下发生:
  1. 列值没有明确地在一个INSERT或LOAD DATA INFILE语句中指定。
  2. 列值没有明确地在一个UPDATE语句中指定且另外一些的列改变值。(注意一个UPDATE设置一个列为它已经有的值,这将不引起TIMESTAMP列被更新,因为如果你设置一个列为它当前的值,MySQL为了效率而忽略更改。)
  3. 你明确地设定TIMESTAMP列为NULL.
  4. 除第一个以外的TIMESTAMP列也可以设置到当前的日期和时间,只要将列设为NULL,或NOW()。

    另外在5.0以上版本中也可以使用trigger来实现此功能。
    create table test_time (
    id int(11),
    create_time datetime
    );

    delimiter |

    create trigger default_datetime before insert on test_time
      for each row
         if new.create_time is null then
           set new.create_time = now();
         end if;|

    delimiter ;
此部分摘自:http://hi.baidu.com/jok607/blog/item/77f1d45cb7d92349faf2c0a3.html
<think>嗯,用户问的是MySQLtimestamp类型的时间值后面为什么会有一个.0,比如“2025-03-10 00:00:00.0”。我需要先确定这个.0代表什么,以及为什么会出现。首先,我应该回忆一下timestamp类型MySQL中的存储格式和显示方式。 记得timestamp类型可以存储日期和时间,从1970-01-01 00:00:01 UTC到2038-01-19 03:14:07 UTC,对吧?而且从MySQL 5.6.4版本开始,timestamp支持小数秒精度,也就是可以存储毫秒、微秒等。用户提到的.0可能就是这个小数秒的部分。 用户给出的例子是“2025-03-10 00:00:00.0”,这里的.0可能表示小数秒为零。那为什么会有这个.0呢?可能是在定义表结构的时候指定了小数秒的精度,比如timestamp(1)表示保留一位小数,这时候即使没有实际的小数部分,也会显示.0。 接下来需要考虑用户的使用场景。用户可能在创建表时指定了timestamp字段的精度,或者在查询时使用了某些函数导致显示小数部分。也有可能是在某些客户端工具中默认显示小数位,即使数据本身没有小数部分。 另外,用户可能对timestamp类型的存储方式不太清楚,特别是小数秒的部分,可能会疑惑这个.0是否会影响数据的存储或比较。需要解释清楚,这个.0只是表示小数秒的精度,实际存储时如果没有指定更高的精度,小数部分会被截断或补零。 还有可能用户是从其他数据库转过来的,比如Oracle或PostgreSQL,这些数据库的时间类型默认显示小数秒,而MySQL在指定精度后也会显示,所以用户可能不太习惯这个显示方式。 另外,需要确认用户是否明确在DDL中使用了小数精度,比如timestamp(1),这时候即使插入的时间没有小数部分,也会显示.0。或者用户可能在插入数据时带入了小数部分,但值为零,导致显示出来。 还要考虑到MySQL的版本问题,如果用户使用的是5.6.4之前的版本,那timestamp是不支持小数秒的,这时候出现.0可能是客户端格式化的问题,或者用户使用了某些转换函数导致显示出来。 总结下来,用户的问题核心在于timestamp类型时间值的小数部分.0的来源和意义。需要解释MySQLtimestamp类型的小数秒精度设置,以及这个.0是如何产生的,可能是在定义表结构时指定了精度,或者在插入数据时包含了小数部分,或者是客户端的显示设置导致的。</think>MySQL 的 `TIMESTAMP` 类型中时间值末尾的 `.0` 表示**小数秒精度**(即毫秒、微秒等部分的占位符),其出现原因和背后的逻辑如下: --- ### 1. **小数秒精度支持** - **功能背景**: 从 **MySQL 5.6.4** 开始,`TIMESTAMP` 类型支持定义小数秒精度(如毫秒、微秒)。 定义时需显式指定精度位数,例如: ```sql TIMESTAMP(1) -- 保留 1 位小数(十分之一秒) TIMESTAMP(6) -- 保留 6 位小数(微秒) ``` 若不指定精度(默认 `TIMESTAMP`),则不存储小数部分。 - **显示规则**: 如果字段定义了小数秒精度(如 `TIMESTAMP(1)`),即使实际存储的小数值为 `0`,MySQL 也会在输出时显示占位符 `.0`。 **示例**: ```sql CREATE TABLE test ( ts_default TIMESTAMP, -- 默认无小数 ts_1 TIMESTAMP(1), -- 保留 1 位小数 ts_6 TIMESTAMP(6) -- 保留 6 位小数 ); INSERT INTO test VALUES ( '2025-03-10 00:00:00', '2025-03-10 00:00:00.0', '2025-03-10 00:00:00.000000' ); SELECT * FROM test; -- 输出结果: -- ts_default: 2025-03-10 00:00:00 -- ts_1: 2025-03-10 00:00:00.0 -- ts_6: 2025-03-10 00:00:00.000000 ``` --- ### 2. **为什么会有 `.0`?** - **原因一:字段定义了小数精度** 若字段定义为 `TIMESTAMP(N)`,无论插入的值是否包含小数秒,MySQL 都会按定义的精度补全小数位(不足补零,超长四舍五入)。 **示例**: ```sql -- 定义字段为 TIMESTAMP(1) INSERT INTO test (ts_1) VALUES ('2025-03-10 00:00:00'); -- 插入时未写小数 SELECT ts_1 FROM test; -- 输出 2025-03-10 00:00:00.0 ``` - **原因二:客户端或工具的格式化** 部分数据库客户端(如 MySQL Workbench)可能统一显示时间字段的小数位占位符,即使实际值为零。 --- ### 3. **常见场景与注意事项** - **场景 1:显式插入带小数的值** 若插入值时包含小数秒(如 `2025-03-10 00:00:00.123`),但字段定义的精度不足(如 `TIMESTAMP(1)`),则小数部分会四舍五入: ```sql INSERT INTO test (ts_1) VALUES ('2025-03-10 00:00:00.15'); SELECT ts_1 FROM test; -- 输出 2025-03-10 00:00:00.2(四舍五入到 1 位) ``` - **场景 2:无小数精度的字段** 若字段未定义小数精度(默认 `TIMESTAMP`),插入带小数的值会直接截断: ```sql INSERT INTO test (ts_default) VALUES ('2025-03-10 00:00:00.123'); SELECT ts_default FROM test; -- 输出 2025-03-10 00:00:00(舍弃小数部分) ``` - **注意时区影响**: `TIMESTAMP` 存储为 UTC 时间,查询时会按会话时区转换。但小数秒精度与时区无关,仅依赖字段定义。 --- ### 4. **总结** - `.0` 是 **小数秒精度占位符**,由字段定义或客户端格式化引起。 - **若需避免显示 `.0`**: - 定义字段时不指定小数精度(使用默认 `TIMESTAMP`)。 - 应用层格式化输出时去除小数部分(如使用 `DATE_FORMAT(ts_1, '%Y-%m-%d %H:%i:%s')`)。 - **若需精确控制小数秒**: - 合理定义 `TIMESTAMP(N)` 的精度位数(`N=0~6`)。 - 插入值时显式指定小数部分(如 `.123456`)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值