diff --git a/mysql/mysql文档/Data Type.md b/mysql/mysql文档/Data Type.md index f6e1e1c..7530437 100644 --- a/mysql/mysql文档/Data Type.md +++ b/mysql/mysql文档/Data Type.md @@ -95,12 +95,12 @@ CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0)); > ***explicit_defaults_for_timestamp已启用*** > 如果 explicit_defaults_for_timestamp 属性已经被启用,那么不会将CURRENT_TIMESTAMP赋值给timestamp字段做默认值,也不会在更新时自动将CURRENT_TIMESTAMP赋值给timestamp字段。并且,任何没有声明为not null的timestamp字段都是可为空的。 -> ***explicit_defaults_for_timestamp未启用*** +> ***explicit_defaults_for_timestamp未启用*** > 除非被显式指定,否则数据表中的timestamp列都会被赋值为最近修改的datetime。该属性开未开启时,可以通过timestamp字段记录上次update或insert时间。 > 可以通过为timestamp字段赋值一个null来将该字段设置为当前时间,除非该字段在定义时通过NULL属性声明该字段可以为空。 > ***自动赋值为当前时间和记录更新时间设置*** -> 可以在定义该timestamp列字段时指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP,为该timestamp字段指定默认值和记录最近更新时间。默认情况下,第一个timestamp列字段具有这些属性,数据表中的任何timestamp字段也可以手动指定这些属性。 +> 可以在定义该timestamp列字段时指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP,为该timestamp字段指定默认值和记录最近更新时间。***若explicit_defaults_for_timestamp未启用,默认情况下,若第一个timestamp列没有指定default和on update属性中的任何一个,第一个timestamp列字段具有这些属性,数据表中的任何timestamp字段也可以手动指定这些属性。*** ### time(fsp) time类型的范围为'-838:59:59.000000'到'838:59:59.000000',msyql显示time类型的格式为'hh:mm:ss[.fraction]',但是对time类型的赋值既可以用字符串类型也可以用数字类型。 @@ -113,16 +113,16 @@ year类型用来表示年,year类型通过YYYY格式进行展示,为year类 > SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name; > ``` -## mysql中timestamp的存储 +### mysql中timestamp的存储 在mysql中,timestamp在存储时,会从本地时区转化为UTC时区然后再存储到数据库中,在获取存储的timestamp时会从UTC时区转化为本地时区(该行为在其他类型,如datetime,中则不会发生)。 ### mysql中的时区 在默认情况下,对于每个Connection,当前时区为mysql server的时区。但是,Connection时区也可以针对每个Connection单独设置(在jdbc:mysql://{server}:{port}/{db_name}?{追加参数}中单独设置)。 > 由于时区统一转化为UTC后再存储于数据库中,那么在存储了timestamp之后,若再次访问timestamp时时区发生了改变,那么将存储的UTC时区timestamp转化为Connection对应时区时,转化后时区时间和存储时的时区时间并不相同。 -## time、datetime和timestamp传入无效值时 +### time、datetime和timestamp传入无效值时 对于无效的time、datetime、timestamp值,会将其转化为该类型默认的‘0’值,例如'0000-00-00'或者'0000-00-00 00:00:00'。 -## tmestamp转化为datetime +### tmestamp转化为datetime 可以通过cast()函数和at time zone操作符将timestamp类型转化为datetime类型。 ```sql SELECT col, @@ -130,7 +130,7 @@ SELECT col, FROM ts ORDER BY id; ``` -## mysql中date部分 +### mysql中date部分 - 在mysql中,对于date类型或者timestamp或datetime中的date部分,任何标点符号都可以作为分隔符 ```sql '10:11:12' 代表 '2010-11-12' @@ -138,7 +138,7 @@ SELECT col, ``` - 当date中年份只包含两位数时,若年份为00~69,则会变为2000~2069,若年份为70~99,则年份为1970~1999 -## time类型 +### time类型 mysql中获取和展示time类型的格式为'hh:mm:ss'。time的范围为'-838:59:59' 到 '838:59:59'。 > ***time范围*** > 之所以time的范围会如此之大并且支持负值,是因为time类型不仅可以用来表示一天中的时间点,还可以用来表示两个时间点之间的间隔(间隔可能超过24h,也有可能为负值) @@ -147,6 +147,37 @@ mysql中获取和展示time类型的格式为'hh:mm:ss'。time的范围为'-838: - 缩写中带有冒号':'时,值将会被解释为一天中的时间点,并且,’11:12'将会被解释为'11:12:00'而不是'00:11:12' - 缩写中不带冒号时,将会被解释为两个时间点之间的间隔。并且,最右边的两个数将会被解释为秒,'1112'和1112也会被解释为'00:11:12' -## year类型 +### year类型 在mysql 8.0.19中,不再支持year(4)这种显式指定宽度的方式已经被废弃,并且,过去支持的year(2)类型在8.0.19中也不再被支持。 -> year类型支持的范围是'1901'到'2155',也可通过数字类型1901到2155指定 \ No newline at end of file +> year类型支持的范围是'1901'到'2155',也可通过数字类型1901到2155指定 + +### timestamp类型和datetime类型自动初始化和更新 +对于timestamp类型和datetime类型,可以被自动初始化和更新到当前的时间。 +> 当对timestamp或者datetime字段设置了on update current_timestamp时,若某行中任一其他列的值发生变化,该列变化前后值不同,那么设置了on update的datetime或timestamp字段会更新到当前时间。若update前后所有的列值都与修改之前相同,那么即使执行了update操作,on update列的时间也不会更新。 +> ***如果想要防止设置了on update的列在其他列被修改时更新为当前时间,可以显式将该列设置为该列当前的值。*** +> ```sql +> # 即使dt被设置了on update,id变更后dt仍然为当前的值 +> update dt=dt,salary+=10 wherre id = 1000 + +> ### current_timestamp的同义词 +> 如下同义词都和current_timestamp具有相同的含义 +> - current_timestamp() +> - now() +> - localtime +> - localtime() +> - localtimestamp +> - localtimestamp() + +### timestamp或datetime指定小数位精度 +如果timestamp或者datetime类型在声明时使用了小数位精度,那么在current_timestamp后也要指定相同的精度。 +```sql +CREATE TABLE t1 ( + ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) +); +``` + +### explicit_defaults_for_timestamp +当explicit_defaults_for_timestamp关闭时,timestamp默认情况下是not null的,该类字段不能含有null值,若将字段显式设置为null时,字段值实际被设置为当前时间。若想要允许该字段包含null,可以在声明该字段时显式指定null属性,此时默认值也会变为null。 +当explicit_defaults_for_timestamp启用时,只有指定timestamp字段null属性时该字段才能为空。并且,在explicit_defaults_for_timestamp启用时不可以通过赋值字段为null的形式来将timestamp字段设置为当前值。 +> ***当explicit_defaults_for_timestamp开启时,默认条件下timestamp类型声明会自动添加null default null*** +