| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 大数据 -> Postgresql 数据库时区(timezone)设置,以及TIMESTAMPTZ和TIMESTAMP数据类型的选择 -> 正文阅读 |
|
[大数据]Postgresql 数据库时区(timezone)设置,以及TIMESTAMPTZ和TIMESTAMP数据类型的选择 |
timestamp和timestamptz都占用8个字节,在存储时间时并没有本质的区别,都不携带时区信息。只是在insert保存数据和select给数据库客户端返回数据时处理方式不同。 下边以具体示例解释这两种数据类型的差别,以及他们与数据库链接时区(session对应的时区)和postgresql数据库时区之间的关系。下边例子使用的数据库时区是Etc/UTC (GMT + 0),首先创建表,然后做相应操作:
?从上边的输出可以看出,随着数据库连接的时区的改变,同样的数据显示的不一样。对于timestamptz_col列,他会随着数据库链接session对应的时区的改变,而改变。而timestamp_col列,则不改变,只是把保存在数据库中的原始数据原封不动的返回给数据库链接客户端。 在插入(保存)数据时,不管是timestamp还是timestamptz,都不会保存时区信息,这也是为什么这两种类型的数据都占用8个字节,保存的时间精度也都是一样的。但是针对timestamp_col字段,只是把insert语句的时间原封不动的保存到数据库中,select的时候原封不动的返回,不会去考虑时区转换问题。而timestamptz, insert时会转换成数据库对应的时区的时间,select时,再转换成session对应的时区的时间。 因为上边我们设置的时区都是针对当前所在数据库链接的(所谓的session),当新建一个链接之后,我们之前对应之前链接设置的session信息就会丢失。
?如上所示,新建一个链接之后,当前session所在的链接又变回了数据库的默认时区。 如果要修改数据库的时区,而非session的时区,则需要修改postgresql.conf文件,
?注意不同版本的postgresql,对应的配置文件路径可能不一样。修改完之后,需要重启。 总结: 1. timestamp和timestamptz类型的数据虽然都不保存时区信息,但是timestamptz却通过结合数据库设置的时区,session对应的时区以及timestamptz本身保存的数据,将正确的时间返回给客户端。也就是说从宏观上,timestamptz看起来确实像是保存了时区信息的timestamp数据,只不过这个时区是整个数据库设置的时区。 2. 什么时候使用timestamptz类型,什么时候使用timestamp? 简单说针对简单应用,只有单一客户端(单体应用)或同类型多个应用访问数据库(比如多个微服务),如果数据库保存的时间是由客户端应用程序保证时区正确性,这时就可以使用timestamp。因为这时,不管数据库的时区是Etc/UTC还是'Asia/Shanghai',数据库都不会对客户端传过来的数据做处理,只是原封不动的保存。select的时候再原封不动的返回。至于应用程序的客户端,比如一个新闻web应用的客户端是浏览器,如果希望根据浏览器所在区域的时区正确显示从数据库返回的时间,这是需要新闻web应用做转换,或者在时间上加上时区信息一起返回给浏览器客户端,由客户端做时间转换。 而如果有多种不类型客户端需要访问同一数据库,这个时候可以考虑使用timestamptz, 这样不管哪个客户端都可以根据当前session的时区正确获取对应的时间。 以上只是个人理解,可能有不准确的地方还望指正。 最后,需要说明的是,针对整个数据库的时区设置,个人认为作用不大。唯一的用处也许是使用postgresql命令行客户端psql连接数据库时,使session默认的时区设置成跟整个数据库时区一致,其他作用并不明显。因为如果你是使用例如DBeaver这种图形化数据库客户端工具,默认他会帮你把session的时区设置成DBeaver当前所在主机的时区,这样他显示timestamptz类型的数据时,也是完全没有问题的。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 2:31:34- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |