mysql的timestamp会存在时区问题?

2023-10-27

简介

 

众所周知,mysql中有两个时间类型,timestamp与datetime,但当在网上搜索timestamp与datetime区别时,会发现网上有不少与时区有关的完全相反的结论,主要两种:

  1. timestamp没有时区问题,而datetime有时区问题,原因是timestamp是以UTC格式存储的,而datetime存储类似于时间字符串的形式,示例博文:MySQL 中 datetime 和 timestamp 的区别与选择
  2. timestamp也有时区问题,示例博文:mysql中timestamp时区的问题

两种观点让人迷惑,那timestamp到底会不会有时区问题呢?

基本概念

时区:
由于地域的限制,人们发明了时区的概念,用来适应人们在时间感受上的差异,比如中国的时区是东8区,表示为+8:00,或GMT+8,而日本的时区是东9区,表示为+9:00,或GMT+9,当中国是早上8点时,日本是早上9点,即东8区的8点与东9区的9点,这两个时间是相等的。
另外时间还有如下两个概念:

  1. 绝对时间:

如unix时间缀,是1970-01-01 00:00:00开始到现在的秒数,如:1582416000,这种表示是绝对时间,不受时区影响,也叫纪元时epoch。

  1. 本地时间:

相对于某一时区的时间,是本地时间,比如东8区的2020-02-23 08:00:00,是中国人的本地时间,而在此时,日本人的本地时间是2020-02-23 09:00:00,所以本地时间都是与某一时区相关的,脱离时区看本地时间,是没有意义的,因为你并不知道这具体是指的什么时间点。

比如在Java中,Date对象是绝对时间,通过SimpleDateFormat格式化出来的yyyy-MM-dd HH:mm:ss形式的时间字符串,是本地时间,如果SimpleDateFormat没有调用setTimeZone()显示指定时区,那么默认用的是jvm运行在的操作系统上的时区,我们开发机上的时区基本都是GMT+8

timestamp与datetime区别

如下,我创建了一张表,里面time_stamp是timestamp类型,date_time是datetime类型,create_timestamp、create_datetime是timestamp与datetime类型,但是它们可以由数据库自动生成。

CREATE TABLE `time_test` (
  `id` bigint unsigned,
  `time_stamp` timestamp,
  `date_time` datetime,
  `create_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `create_datetime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
)
复制代码

1、首先将数据库时区设置为+8:00,即中国的东8区

set_timezone


2、然后如下手动插入一个固定时间的数据,以及用now()函数插入当前时间

insert_data


3、当插入完数据后,然后我们修改当前会话的时区为+9:00,即日本的东9区,然后再次查看数据

mod_timestamp


4、如上,定义为timestamp类型的列time_stampcreate_timestamp不管是手动插入的,还是now()函数插入的,东9区都比东8区的时间大1个小时,这是正确的,说明timestamp类型是时区相关的,然而定义为datetime类型的date_timecreate_datetime字段,时间都没有变化,这说明datetime类型是时区无关的。

结论:
timestamp在存储上是包含时区的,而datetime是不包含时区,说明网上的第一种说法是对的。

再看个例子
我们将东8区的的2020-02-23 08:00:00转换为unix时间缀(绝对时间),再插入数据库试试?
如下,使用linux的date命令转换时间串为unix时间缀:

$ "date" --date="2020-02-23 08:00:00 +08:00" +%s
1582416000
复制代码

然后用mysql的from_unixtime()函数,将unix时间缀转换为mysql时间类型来插入数据。

from_unixtime


如上,查询出来的时间,也是东9区的9点,时间也是正确的。

为什么网上又说timestamp类型存在时区问题?

我发现网上说timestamp有时区问题,都是应用端插入数据,然后到数据库中去看,结果发现时间不一样,因此我打算在Java中写个Demo试一下,看能不能重现这个问题。

1、首先,下面是Java中Entity的定义,与上面的time_test表对应,注意,这里面时间属性都是用Date类型定义的,如下:

TimeTest


2、然后,我写了两个接口/insert/queryAll来插入与查询数据,如下:

insert_queryAll


3、然后我把数据库的时区设置为+09:00时区,即日本的东9区,如下:

set_timezone


4、然后调用/insert接口插入数据,注意我接口传入的时间是东8区的8点,如下:

postman_insert


5、插入完后,去数据库中查询一把,如下:

query_insert


可以看到,time_stamp字段时间是9点,且我已将数据库时区设置为东9区,东9区的9点与东8区的8点,这两个时间实际是相等的,因此时间数据没错。
6、然后我使用/queryAll接口将数据查询出来,如下:

postman_queryAll


timeStamp属性是1582416000000,这是毫秒级的时间缀,秒级则是1582416000,对应是东8区的2020-02-23 08:00:00,时间数据也没错!

7、然后我又将mysql时区修改回+8:00,并重启我们的java应用,如下:

set_timezone


8、再查询一下数据,如下:

postman_queryAll


timeStamp属性还是1582416000000,时间没有变化,这也是正确的。

那为什么网上会说timestamp存在时区问题?

经过一翻查看,我发现他们都提到了jdbc的serverTimezone,会不会是这个配置错误导致的呢?就先试试吧!
1、如图,我把数据库时区修改回+9:00时区,然后故意把jdbc的url上的serverTimezone配置为与数据库不一致的GMT+8时区,然后重启java应用,如下:

set_timezone

url: jdbc:mysql://localhost:3306/testdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8
复制代码

其中GMT%2B8就是GMT+8,因为在url上需要urlencode,所以就变成了GMT%2B8
2、重新插入数据,注意插入的时间还是东8区的8点,如下:

postman_insert


3、然后,我再到数据库中查询一把,如下:

query_insert


time_stamp中时间竟然是8点!要知道我们虽然插入的是东8区的8点,但当前会话可是东9区的,东8区的8点等于东9区的9点,所以正确显示应该为9点才对,时间差了1小时!
4、然后,我又调用/queryAll接口查询了一把,想看看mybatis查询出来的时间数据对不对,如下:

postman_queryAll


可以看到timeStamp1582416000000,秒级是1582416000,这个时间就是东8区的8点,东9区的9点啊!查询出来的时间竟然是正确的,为什么???

serverTimezone的本质

为了找出问题所在,我调试了一下mysql的jdbc驱动代码,终于弄明白了原因,主要可以看看如下这几点:

1.mysql驱动创建连接后,会调用com.mysql.jdbc.ConnectionImpl#configureTimezone()来配置此连接的时区,如果配置了serverTimezone,则会使用serverTimezone配置的时区,没配置时会去取数据库中的time_zone变量,这就是为什么我们没有配置serverTimezone变量时,结果也是正确的。

//若使用普通驱动,使用此方法配置mysql连接的时区
com.mysql.jdbc.ConnectionImpl#configureTimezone()
//若使用cj驱动,使用此方法配置mysql连接的时区
com.mysql.cj.protocol.a.NativeProtocol#configureTimezone()
复制代码

2.调用jdbc的setTimestamp()方法时,实际调用的是com.mysql.cj.jdbc.ClientPreparedStatement#setTimestamp(),这里面会根据serverTimezone指定的时区,将对应的Timestamp对象转换为serverTimezone指定时区的本地时间字符串。

3.执行sql语句时,会执行com.mysql.cj.jdbc.ClientPreparedStatement#execute(),这里面sendPacket变量保存着真实会发送到mysql的sql语句。

注:看的是8.0.11版本mysql-connector-java驱动源码,不同版本代码会稍有差异,比如5.2.16版本驱动,jdbc url上需要同时配置这两个配置:useTimezone=true&serverTimezone=GMT%2B8,且setTimestamp()对应的是com.mysql.jdbc.PreparedStatement#setTimestampInternal方法。

原理总结如下:
mysql驱动在发送sql前,会将jdbc中的Date对象参数,根据serverTimeZone配置的时区转化为日期字符串后,再发送sql请求给mysql server,同样在mysql server返回查询结果后,结果中的日期值也是日期字符串,mysql驱动会根据serverTimeZone配置的时区,将日期字符串转化为Date对象。

因此,当serverTimeZone与数据库实际时区不一致时,会发生时区转换错误,导致时间偏差,如下:
a、比如sql参数是一个Date对象,时间值是东8区的2020-02-23 08:00:00,注意它里面存储的可不是2020-02-23 08:00:00这个字符串,它是Date对象(绝对时间),只是我用文字表达出来是东8区的2020-02-23 08:00:00
b、然后,由于serverTimeZone配置的是东8区,mysql驱动会将这个Date对象转为2020-02-23 08:00:00,注意这时已经是字符串了,然后再将sql发送给mysql,注意这里的sql里面已经将Date参数替换为2020-02-23 08:00:00了,因为Date对象本身是无法走网络的。
c、然后mysql数据库接收到这个时间字符串2020-02-23 08:00:00后,由于数据库时区配置是东9区,它会认为这个时间是东9区的,它会以东9区解析这个时间字符串,这时数据库保存的时间是东9区的2020-02-23 08:00:00,也就是东8区的2020-02-23 07:00:00,保存的时间就偏差了1个小时。
d、查询结果里时间为什么又对了呢,因为查询结果返回了东9区的时间字符串,而java应用又将其理解为是东8区的时间,负负得正了!

将serverTimezone与mysql时区保持一致
so,那么如果我们将serverTimezone配置改正确,即与数据库保持一致时,应该查询到的时间就会是错的,会少1个小时。

1、jdbc url中使用与数据库一样的东9区GMT+9,如下:

url: jdbc:mysql://localhost:3306/testdb?serverTimezone=GMT%2B9&useUnicode=true&characterEncoding=utf8
复制代码

其中的GMT%2B9,即是GMT+9

2、然后重启Java应用,再查询一把看看,如下:

postman_queryAll


返回的是毫秒级时间缀1582412400000,秒级就是1582412400,使用linux的date命令转换为时间字符串形式:

$ "date" --date="@1582412400" +"%F %T %z"
2020-02-23 07:00:00 +0800
复制代码

看到没,它是东8区的7点,刚好差了1个小时。

3、所以,使用mysql的timestamp类型时,对于java应用来说,一定要保证jdbc url中的serverTimezone与数据库中的时区配置是一致的。
另外一点是,当没有配置serverTimezone时,mysql驱动会自动读取mysql server中配置的时区,这里面也有坑!如下:

mysql驱动自动读取数据库时区的坑
3.1 mysql安装好后,默认时区是SYSTEM,而SYSTEM指的是system_time_zone变量的时区,如下:

3.2 当mysql驱动读到time_zone变量是SYSTEM时,会再去读取system_time_zone变量,而system_time_zone对于国内来说,默认是CST,这是一个混乱的时区,是4个不同时区的缩写,如下:

cst


对于Linux或MySQL,会认为CST是中国标准时间(+8:00),但Java却认为CST是美国标准时间(-6:00)(注:可能和Java运行在Windows中有关):
如下,linux中CST等于+0800,即中国时区:

$ "date" +"%F %T %Z %z"
2021-09-12 18:35:49 CST +0800
复制代码

如下,java中CST等于-06:00,美国时区:

java_timezone

3.3 因此mysql驱动取到CST这个时区值时,它会以为这是-6:00时区,但MySQL却理解为+8:00时区,因此MySQL时区一定不要配置为CST,而要配置为具体的时区,如+8:00,但如果MySQL时区为CST且不可修改的情况下,一定要配置jdbc的serverTimezone为清晰的时区(如:GMT+8)。

Entity中日期属性是String呢?

1、我们将Entity对象中的时间属性改为String(不推荐),如下:

TimeTest2


2、然后也写两个接口,/insert2/queryAll2,如下:

insert2_queryAll2


3、然后插入数据,注意这时我是直接将无时区的8点,作为参数给到sql的,如下:

postman_insert2


4、然后再查询一把,如下:

query_insert2


如上所示,time_stamp字段值是8点,但此时数据库时区是东9区,所以这是东9区的8点。
5、然后我将数据库与jdbc中serverTimezone都改为东8区呢,改完后重启Java应用,如下:

set_timezone

url: jdbc:mysql://localhost:3306/testdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8
复制代码

6、再次插入数据,参数还是无时区的8点,如下:

postman_insert2


7、再查询一把,如下:

query_insert2


如上所示,time_stamp字段值是8点,但现在数据库时间是东8区,所以这是东8区的8点。
8、然后我再将jdbc url上的serverTimezone调整为东9区,然后重启Java应用,如下:

url: jdbc:mysql://localhost:3306/testdb?serverTimezone=GMT%2B9&useUnicode=true&characterEncoding=utf8
复制代码

现在serverTimezone与数据库中不一致,数据库是东8区,serverTimezone是东9区。
9、我们再次插入无时区的8点,如下:

postman_insert2


10、然后再查询一把,如下:

query_insert2


time_stamp字段值还是8点,数据库是东8区,所以这是东8区的8点,但我们serverTimezone与数据库的时区不一致啊,没看到时间有偏差,为什么?

解释一下
前面说过了,对于jdbc中的Date对象,在发送给mysql前,会先根据serverTimezone转换为相应时区的时间字符串,但现在Entity中时间属性是String类型,mysql驱动不会进行转换,所以不管serverTimezone怎么配置,对String类型的时间串都没影响。

这样的话,似乎java中日期类型用时间字符串来存还好些,不容易出错,但请再认真考虑一下,调用方传了一个无时区的8点,数据库自作主张,就将其认为是东9区的8点,但如果这个时间字符串实际是东8区的8点呢?这时如果保存到数据库中为东9区的8点,那数据就存错了!

那如果目前api接口就传的无时区的时间串,Entity中就定义的String,怎么解决呢?
1、询问接口定义人员,这个接口的时间串指的是哪个时区的,比如是东8区的2020-02-23 08:00:00。
2、然后接口接收到时间后,要以东8区将时间字符串转换为Date对象,如下:

SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss');
sdf.setTimeZone(TimeZone.getTimeZone("GMT+8"));
Date date = sdf.parse("2020-02-23 08:00:00");
复制代码

3、然后如果Entity中时间属性定义的是String,那么我们要再将Date对象以数据库的时区格式化为对应的时间字符串,比如数据库时区是东9区,那么格式化后就是2020-02-23 09:00:00,如下:

SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd HH:mm:ss');
sdf.setTimeZone(TimeZone.getTimeZone("GMT+9"));
String dateStr = sdf.format(date);
entity.setTimeStamp(dateStr);
复制代码

4、然后将Entity保存到mysql中的,就也会是东9区的2020-02-23 09:00:00,结果正确。

所以,使用String类型来存储时间数据,要想将时间值保存正确,超级麻烦,不建议在实际开发中这种使用。

最佳实践

1、大多数团队会规定api中传递时间要用unix时间缀,因为如果你传一个2020-02-23 08:00:00时间值,它到底是哪个时区的8点呢?对于unix时间缀,就不会有此问题,因为它是绝对时间。而如果某些特殊原因,一定要使用时间字符串,最好使用ISO8601规范那种带时区的时间串,比如:2020-02-23T08:00:00+08:00

2、Mybatis中Entity定义要与数据库定义一致,数据库中是timestamp,那么Entity中要定义为Date对象,因为mysql驱动在执行sql时,会自动根据serverTimezone配置帮你转换为数据库时区的时间串,如果你自己来转换,你极有可能因为忘记调用setTimeZone()方法,而使用当前java应用所在机器的默认时区,一旦java应用所在机器的时区与数据库的时区不一致,就会出现时区问题。

3、jdbc的serverTimezone参数,要配置正确,当不配置时,mysql驱动会自动读取mysql server的时区,此时一定要将mysql server的时区指定为清晰的时区(如:+08:00),切勿使用CST。

4、如果数据库时区修改后,jdbc的serverTimezone也要跟着修改,并重启Java应用,就算没有配置serverTimezone,也需要重启,因为mysql驱动初始化连接时,会将当前数据库时区缓存到一个java变量中,不重启Java应用它不会变。

数据库中用timestamp还是int来存储时间?

如果用int型时间缀存储,不管数据库时区是啥,都不影响,因为存储的是绝对时间,看起来完美解决了时区问题。
但从某些角度看,这种方案只是把时区问题从数据库端推到应用端去了,时区问题将出现在将时间字符串转换为时间缀的过程中,比如某程序员从api接口中拿到时间字符串后,没考虑时区,直接转为unix时间缀,就可能出现时区问题。
因此,对于不带时区的时间串解析,一定要问清楚这是哪个时区的时间,并在代码中显式指定!

另外,用int存储时间还有如下3个不好的点:

  1. 开发人员看到这个字段后,无法一目了然的了解到这个时间缀大概是个什么时间,需要去转换一下,会很繁琐。
  2. update_time这样的字段,数据库提供了DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP的机制,这样在更新任何字段时,update_time会自动更新,而如果使用int存储,就需要程序员每次更新表时,重新set这个字段,容易遗忘。
  3. 由于int只有4个字节,用它来存储时间,会在2038年后溢出,而对于timestamp来说,MySQL将其底层存储统一修改为8个字节,相对来说还是比较容易的。

当然,也并不是建议不用int,这是见仁见智的,不管用timestamp还是int,都没有致命性问题的。

总结

timestamp本身是没有时区问题的,时区问题是由于serverTimezone配置错误、mysql使用CST这种混乱时区或Entity中将日期定义String类型导致的。


作者:打码日记
链接:https://juejin.cn/post/7007044908250824741
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mysql的timestamp会存在时区问题? 的相关文章

  • 在记录活动中使用 readConfiguration 方法

    为了在小型 Java 桌面应用程序中使用日志记录 我试图深入了解一些方法的操作 我使用一个非常愚蠢的小Java程序来测试它们 特别是 在测试 LogManager readConfiguration 方法的行为时 我发现了一些奇怪的事情 在
  • 限制执行第三方软件的线程的权限

    我正在开发一个基于 Eclipse 的应用程序 能够执行第三方组件 不是 eclipse plugin 每个组件都有一个列出权限 以及相应动机 的自定义描述符 这样最终用户可以决定是否执行它 组件在单独的线程中执行 如何根据描述符限制这些线
  • Spring批处理2.2 JavaConfig

    我正在尝试让 Spring Batch 2 2 与 JavaConfig 一起使用 如今他们有一个 EnableBatchProcessing设置很多东西的注释 默认情况下 该注释使用数据源作为其作业数据 但我们不想保存此数据 也不想为其创
  • 即使为空也显示值

    我正在使用以下内容显示过去 7 天内添加的产品计数 即使 COUNT 0 我是否可以以某种方式定制查询以显示过去 7 天的所有产品 查询现状 SELECT DAYNAME dateadded DAY COUNT COUNT FROM pro
  • 单击按钮时更改照片

    import javax swing Icon import javax swing ImageIcon public class Stage1 extends javax swing JFrame int score 0 int iter
  • 在Java中,为什么equals()和hashCode()必须一致?

    如果我重写类上的任一方法 它必须确保如果A equals B true then A hashCode B hashCode也一定是真的 有人可以给我看一个简单的例子 如果违反了这一点 就会导致问题吗 我认为这与您是否使用该类作为 Hash
  • Linux 上的 JavaFX

    Linux x86 和 x64 上的 JavaFX 情况如何 JavaFX 应用程序可以在 Linux 操作系统上顺利执行吗 我发现了 2011 年和 2012 年的一些问题 当时应用程序不稳定 目前发布的 JFX 版本是 2 2 4 在
  • 使用 Hibernate/Spring 生成数据库更新脚本

    我有一个项目 我们过去依赖 hibernate 来更新数据库 hibernate hbm2ddl auto update 即使在产品上 我正在将其迁移为使用 liquibase 我唯一担心的是 并不是我的团队中的每个人都是 sql 专家 因
  • Apache HttpClient 4.x 在上传较大文件时表现奇怪?

    我正在使用 java 和 scala 开发和测试一个简单的客户端 服务器应用程序 The server是基于com sun net httpserver HttpServer并允许使用 POST 和 PUT 操作通过基本的 RESTful
  • ubuntu上rails mysql gem问题

    Ruby on Rails 我想调用本地主机上的控制器 但服务器说 缺少 mysql gem 将其添加到您的 Gemfile 中 gem mysql 2 8 1 问题 当我点击 gem list 命令时 我得到了一个包含 mysql 2 8
  • Selenium 和 xpath:查找带有类/id 的 div 并验证其中的文本

    我正在努力拥有xpath find a div并验证div有一个特定的string里面的文字 这是HTML div class Caption Model saved div and div class gwt HTML sfnStanda
  • 面临 process.start(); 的问题在 Android 棒棒糖中

    面临一个问题process start 在 Android 棒棒糖中 我在服务中遇到了 android lollipop 后台进程的问题 我的代码在 KitKat 之前工作正常 我有一个ProcessBuilder pBuilder并向其中
  • 为什么 (Oracle) JVM 对内存使用有固定上限 (-Xmx)?

    本着提问的精神Java 为什么存在 MaxPermSize https stackoverflow com questions 3356005 java why does maxpermsize exist 我想问一下为什么Oracle J
  • Perl 和 MySql 中的 utf8 编码

    我的数据库 MySql 有 utf8 general 排序规则 我正在从数据库访问数据并显示一个网页 用 Perl 开发 它显示瑞典语字符 和不同的字符 我检查了Mysql数据库 在那里我可以看到其中包含 字符的数据 看来 访问数据时存在编
  • 如何显示 javadoc 代码块中的泛型?

    我有一个 javadoc 代码块 我想在其中编写一个包含泛型的代码示例 如下所示 public interface SomeInterface
  • JRuby调用了错误的方法

    我在调用 Java 方法时遇到了一个奇怪的问题JRuby http en wikipedia org wiki JRuby 在我的 Java 类中 这些方法定义了两次 看来 JRuby 调用了错误的方法 所以我尝试使用java method
  • 控制台中的 Java msg - 两个方法具有相同的方法签名但不提供可分配的类?

    在迁移到 java 1 8 时 我升级了项目中的许多依赖项 它是基于spring 4 3的应用程序 有很多外部依赖 例如 JMS HTTP客户端 FTP XML等 当应用程序启动时 我现在在控制台中收到以下消息 两个方法具有相同的方法签名但
  • JdbcTemplate queryForInt/Long 在 Spring 3.2.2 中已弃用。应该用什么来代替呢?

    JdbcTemplate 中的 queryforInt queryforLong 方法在 Spring 3 2 中已弃用 我无法找出为什么或什么被认为是使用这些方法替换现有代码的最佳实践 典型方法 int rowCount jscoreJd
  • 如何在数据库中存储世界各地的所有地理位置?

    我在一家旅游网站工作 我需要存储游客去过的旅游景点 我需要位置表中的地点是唯一的 以便我可以知道特定地点的受欢迎程度等 我还需要存储在我身边的所有国家 州 城市 因为我不能依赖用户输入 数据库是MySQL 看到这些位置的可用数据集 我发现存
  • 从 Java 程序中获取局部变量的名称和类型

    这是我正在尝试的代码 JavaCompiler compilerA ToolProvider getSystemJavaCompiler int resultA compilerA run null null null Users a Do

随机推荐

  • vue使用vue-amap 高德地图进行选点和搜索

    vue使用vue amap进行地图点的搜索和点击选点 npm install vue amap save 下载npm 包 在main js主文件中进行引用 import VueAMap from vue amap Vue use VueAM
  • C++连接CTP接口实现简单量化交易(行情、交易、k线、策略)

    对于量化交易来说 量化策略和技术系统缺一不可 为了知其所以然 本文实现了一个C 连接CTP接口进行仿真交易的demo 从接收行情 下订单 数据处理到添加策略 挂载运行交易等多个环节来看一下量化交易的最简单流程 管中窥豹 一探究竟 准备工作
  • NetworkManager 使用

    Network Manager Network Manager aims for Network Connectivity which Just Works The computer should use the wired network
  • clickhouse源码:函数分析和自定义函数UDF

    clickhouse函数介绍 clickhouse官方提供了许多的函数 包括常规的数学函数 聚合函数 时间函数 逻辑函数 比较函数等等 关于官方的函数可以在官方文档中查看 官方文档 当然随着clickhouse的流行 国内也有不少的博主已经
  • 《星岛日报》专访:欧科云链AML,助力数字资产合规及风险防控

    6月1日 香港 适用于虚拟资产交易平台营运者的指引 及 打击洗钱指引 正式施行 香港虚拟资产发牌制度正式生效 作为深耕香港市场多年的Web3科技企业 欧科云链OKLink也正式推出的Onchain AML反洗钱合规解决方案 利用多年积累的海
  • python如何建立一个空集合_python的集合set

    一 集合set 概念 1 集合set是一组无序不可重复的key集合 2 set跟dict的key类似 区别在于set没有value 3 set使用场景 1 判断某个元素是否在集合中 2 消除输入数据的重复元素 二 set 的创建方式 1 创
  • timm 视觉库中的 create_model 函数详解

    timm 视觉库中的 create model 函数详解 最近一年 Vision Transformer 及其相关改进的工作层出不穷 在他们开源的代码中 大部分都用到了这样一个库 timm 各位炼丹师应该已经想必已经对其无比熟悉了 本文将介
  • 经典不衰数据可视化项目第一节(共享单车项目)

    1 1 首先导入包 import pandas as pd import numpy as np import matplotlib pyplot as plt import seaborn as sns import datetime i
  • Dectorator:装饰模式

    要为一个类扩展功能 那么可以使用派生 然后由派生类实现扩展的功能 但 若扩展的是个临时功能 或者可能扩展多个不确定功能 就需要使用装饰模式 装饰模式允许为一个类临时添加任意其他功能 并可以任意组合 装饰模式可以在不生成子类的情况下为对象添加
  • 情境领导者-第四章、选择合适的领导风格

    文章目录 情境领导者 第四章 选择合适的领导风格 故事 背景 情境领导模式 每种领到风格中 领导者可以有若干的选择 使用情境领导模式 结束语 情境领导者 第四章 选择合适的领导风格 故事 罗杰斯 让我给你讲一个例子 当我刚开始这里工作的时候
  • strncpy_s

    include stdafx h include
  • 记录.原码、反码、补码是如何简化处理四则运算以及计算机的数值存储

    一 原码反码补码 1 原码 最高位是符号位 正数符号位为0 负数符号位为1 其余是数值 符号位加数值组成原码 2 反码 正数补码是原码 负数补码是除了符号位外其他位取反 3 补码 正数补码是原码 负数补码是其反码加1 二 问题 1 在学习v
  • SQLServer 2008 下载地址(微软官方网站)

    SQLServer 2008 下载地址 微软官方网站 中文版 3 28GB http sqlserver dlservice microsoft com dl download B 8 0 B808AF59 7619 4A71 A447 F
  • 2021年数模国赛B题--乙醇偶合制备 C4 烯烃

    一 题目 C4 烯烃广泛应用于化工产品及医药的生产 乙醇是生产制备 C4 烯烃的原料 在制备过程中 催化剂组合 即 Co 负载量 Co SiO2 和 HAP 装料比 乙醇浓度的组合 与温度对 C4 烯烃的选择性和 C4 烯烃收率将产生影响
  • 前端面试——实现数组的复制

  • 来了!Goby一年一度的红队专版正式发布!!

    某大型活动临近 盆圈开始热闹起来 各种抢人大赛以及群集结号声 Goby今年有什么动作呢 继续支持攻击队 红队 也称蓝军 为何有且仅有红队专版 如果对方是一位绝世武功高手且拥有绝世宝剑 你肯定没有信心与他一战 但如果给你配一把枪呢 哪怕是一把
  • 关于微信小程序复制到剪贴板显示默认提示词的问题

    早上一上班 看到一个需求 小程序实现点击复制到剪贴板 在开发文档找了 剪贴板 关键词 就直接找到了相关的接口 如图 心里很是欣慰 结果如下 提示词显示固定 不能修改任何东西 在社区里找了一下 得到的结果 暂未解决 针对这一问题 网上解决办法
  • flask的ORM操作

    flask的ORM操作 目录 flask的ORM操作 ORM Flask SQLAlchemy扩展 数据模型 模型之间的关联 表管理 操作数据 新增 修改 删除 事务 查询 Flask SQLAlchemy提供了分页方法 四 文件的迁移 f
  • Matlab 2014b m_map 工具箱的19种投影projection

    很久之前做过mmap的投影代码及图 不过当时自己水平也不行 无论是对图的理解还是对matlab的理解都不足 后来博客搬来搬去的 图也丢了 代码也挂了 正好最近又在用 所以重新做了一遍 投影主要分四类 1 Azimuthal projecti
  • mysql的timestamp会存在时区问题?

    简介 众所周知 mysql中有两个时间类型 timestamp与datetime 但当在网上搜索timestamp与datetime区别时 会发现网上有不少与时区有关的完全相反的结论 主要两种 timestamp没有时区问题 而dateti