公众号上转的满天飞的一篇文章,MySQL优化相关的,无意中瞄到一句“尽量使用TIMESTAMP而非DATETIME”,之前对TIMESTAMP也不太熟悉,很少使用,于是查了一下两者的区别。

其实,不管在SQL Server中还是MySQL中,“尽量使用TIMESTAMP而非DATETIME”都是有问题的。


在SQL Server中的TIMESTAMP

SQL Server中,TIMESTAMP是ROWVERSION的同义词,或者说是别名,TIMESTAMP或者ROWVERSION是什么鬼?
MSDN上的解释是:数据库中公开的、自动生成的唯一二进制数字的数据类型。参考这里
两个定语:唯一的,二进制的,说白了就是数据库级别唯一性的一个二进制数据类型
 
SQL Server中TIMESTAMP/ROWVERSION的表现:
1,不可显式插入(或者是更新)。
2,对(包含了)rowversion的表更新非rowversion字段更新的时候,rowversion会自动更新。
3,rowversion在数据库级别具有全局性、递增性、不可回滚性等。
 
不可显式往timestamp类型字段插入值,只能以default或者默认值的方式插入

只能以默认值或者默认生成的方式插入数据

对(包含了)rowversion的表中的数据行更新的时候,rowversion会自动更新。

全局性,这里暂不表述全局性的一些细节问题。

ROWVERSION的作用:
标记数据行的更改,也就是说,一个表包含了ROWVERSION的字段的时候,ROWVERSION字段在数据发生变化(新增,更新)的时候自动更新。
可以根据ROWVERSION来比较不同数据源相同数据行中是否发生了变化,用来做数据同步。比较少使用

MySQL中的TIMESTAMP

在MySQL中:

DATETIME :长度8字节,用来标识包含日期和时间部分的值,MySQL以‘YYYY-MM-DD HH:MM:SS’格式检索并显示DATETIME类型字段。
支持的范围是‘1000-01-01 00:00:00’ to ‘9999-12-31 23:59:59’.

TIMESTAMP :长度4字节,用来标识包含日期和时间部分的值,
支持的范围是 ‘1970-01-01 00:00:01’ (标准时间) to ‘2038-01-19 03:14:07’ (标准时间)。

DATETIME 与TIMESTAMP 的不同:
MySQL将TIMESTAMP类型的值转换为UTC时间存储,当然检索的时候以当前时区的时间返回下面具体举例,而DATETIME则不会发生这种情况。

举个简单的例子。
如下,与sqlserver中完全不一致,MySQL中TIMESTAMP 字段是一个日期字段,允许显式插入值。
同一个字段值,没有发生更改的情况下,也就是同一个值,当修改系统的时区之后,显示出来的结果是不一样的。
这一点正如上面说的:MySQL将TIMESTAMP类型的值转换为UTC时间存储,当然检索的时候以当前时区的时间返回。

貌似转来转去的有点蛋疼,这个特性有什么用处?
这一点对于某些夸时区的应用显示十分有效,最最简单的就是outlook上的收发邮件的时间显示,
比如夸时区的两个人发邮件,发邮件的时间是一个确定的时间,对于A来说,显示自己的时区时间,对于B来说,也是显示为自己时区的时间。
这一点就有点类似于TIMESTAMP,存储为标准时间,根据系统转换为具体的时区时间。

以上,不管在SQL Server中还是MySQL中,DATETIME和TIMESTAMP的作用以及特性都是不同的,SQL Server中尤甚,MySQL也有各自的特性。
选取某种字段类型,是根据需要来的,而不是说可以尽量用哪个,尽量不用哪个。
数据库中很多东西都是根据具体情况来的,网上总结的很多优化的条条框框,怎么说呢,还是不说了!

参考:
https://dev.mysql.com/doc/refman/5.7/en/datetime.html
https://www.eversql.com/mysql-datetime-vs-timestamp-column-types-which-one-i-should-use/
https://docs.microsoft.com/zh-cn/sql/t-sql/data-types/rowversion-transact-sql?view=sql-server-2017

关于两者的区别,笔者一开始也不完全清楚,我也是各种搜索之后简单总结了一下,无意冒犯原作者。

TIMESTAMP类型字段在SQL Server和MySQL中的含义和使用的更多相关文章

  1. 浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别

    最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来.后来,在网上找了下网友总结的区别.在这里做个备忘录: 一,SQL Server中 ...

  2. SQL Server 与MySQL中排序规则与字符集相关知识的一点总结

    字符集&&排序规则 字符集是针对不同语言的字符编码的集合,比如UTF-8字符集,GBK字符集,GB2312字符集等等,不同的字符集使用不同的规则给字符进行编码排序规则则是在特定字符集的 ...

  3. sql server和mysql中分别实现分页功能

    MySQL 在MySQL中,可以用 Limit 来查询第 m 列到第 n 列的记录, 例如: select * from tablename limit m, n sql="select * ...

  4. 数据库 SQL Server 到 MySQL 迁移方法总结

    最近接手一起老项目数据库 SQL Server 到 MySQL 的迁移.因此迁移前进行了一些调查和总结.下面是一些 SQL Server 到 MySQL 的迁移方法. 1. 使用 SQLyog 迁移 ...

  5. 从SQL Server到MySQL,近百亿数据量迁移实战

    从SQL Server到MySQL,近百亿数据量迁移实战 狄敬超(3D) 2018-05-29 10:52:48 212 沪江成立于 2001 年,作为较早期的教育学习网站,当时技术选型范围并不大:J ...

  6. sql server vs mysql

    1.中文: my.ini [mysqld] character-set-server=utf8 character-set-client=utf8 data\testdb\db.opt default ...

  7. SQL Server to MySQL

    使用 Navicat 导入向导迁移 会遇到以下问题 SQL Server 中的 GUID 类型字段会变成 {guid} 多个外层花括号, 导致程序问题. 部分字段类型长度不大一致, 需要手工调整. . ...

  8. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  9. Decimal为SQL Server、MySql等数据库的一种数据类型

    Decimal为SQL Server.MySql等数据库的一种数据类型,不属于浮点数类型,可以在定义时划定整数部份以及小数部分的位数.使用精确小数类型不仅能够保证数据计算更为精确,还可以节省储存空间, ...

随机推荐

  1. 面试题之python基础

    基础语法 输入和输出 代码中要修改不可变的数据会出现什么问题,抛出什么异常? 代码不会征程运行,抛出TypeError异常 a = 1,b = 2,不用中间变量交换a和b的值? # 方法1 a = a ...

  2. Django学习笔记之视图高级-错误处理

    错误处理 在一些网站开发中.经常会需要捕获一些错误,然后将这些错误返回比较优美的界面,或者是将这个错误的请求做一些日志保存.那么我们本节就来讲讲如何实现. 常见的错误码 404:服务器没有指定的url ...

  3. jquery 一键复制文本到剪切板

    <a id="copy" data-clipboard-text="123456">复制文本</a> $(function(){ var ...

  4. Solr4.7.0连接PostgreSQL

    1.把PostgreSQL的Jar包  例如:postgresql-9.1-901-1.jdbc4.jar  或其他版本 放到D:\apache-tomcat-7.0.57\webapps\solr\ ...

  5. GitLab配置后收取不到邮件问题

    一.root权限下,修改gitlab的配置文件:/etc/gitlab/gitlab.rb gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_ ...

  6. ARC085F NRE

    看了题解. 题目大意 你有一个长度为 \(N\) 的全为 \(0\) 的序列 \(A\),给你一个长度同样为 \(N\) 的 \(0/1\) 序列 \(B\),允许你对把 \(A\) 的一些区间中的数 ...

  7. laravel Faker-1.faker假数据

    1. 安装 composer require fzaninotto/faker --dev 2. 创建 migrations 参考:laravel文档 3. 定义ModelFactory 说明: 默认 ...

  8. iptables禁止某个mac地址上网

    iptables -I FORWARD  -m mac --mac-source  60:14:B3:7D:6B:39 -j DROP 上面这条命令测试过是可行,禁止这个mac地址上网,马上禁止马上生 ...

  9. <<让你自己的APP成为系统应用>>所遇到的问题及解决方法

    1.adb connect 10.100.1.772.adb -s 10.100.1.77 shell remount3.让你自己的APP成为系统应用 adb push xxx.apk system/ ...

  10. myeclipse在过时的环境下部署项目出现的问题

    开发环境 操作系统:xp sp3 2002 (ps:客户公司环境只有这个老古董) 开发工具:myeclipse2014  32位 jdk: 1.7_49    32位 DB:DB2  9.1  32位 ...