日常提交
This commit is contained in:
@@ -95,12 +95,12 @@ CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
|
|||||||
> ***explicit_defaults_for_timestamp已启用***
|
> ***explicit_defaults_for_timestamp已启用***
|
||||||
> 如果 explicit_defaults_for_timestamp 属性已经被启用,那么不会将CURRENT_TIMESTAMP赋值给timestamp字段做默认值,也不会在更新时自动将CURRENT_TIMESTAMP赋值给timestamp字段。并且,任何没有声明为not null的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列都会被赋值为最近修改的datetime。该属性开未开启时,可以通过timestamp字段记录上次update或insert时间。
|
||||||
> 可以通过为timestamp字段赋值一个null来将该字段设置为当前时间,除非该字段在定义时通过NULL属性声明该字段可以为空。
|
> 可以通过为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(fsp)
|
||||||
time类型的范围为'-838:59:59.000000'到'838:59:59.000000',msyql显示time类型的格式为'hh:mm:ss[.fraction]',但是对time类型的赋值既可以用字符串类型也可以用数字类型。
|
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;
|
> SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
|
||||||
> ```
|
> ```
|
||||||
|
|
||||||
## mysql中timestamp的存储
|
### mysql中timestamp的存储
|
||||||
在mysql中,timestamp在存储时,会从本地时区转化为UTC时区然后再存储到数据库中,在获取存储的timestamp时会从UTC时区转化为本地时区(该行为在其他类型,如datetime,中则不会发生)。
|
在mysql中,timestamp在存储时,会从本地时区转化为UTC时区然后再存储到数据库中,在获取存储的timestamp时会从UTC时区转化为本地时区(该行为在其他类型,如datetime,中则不会发生)。
|
||||||
### mysql中的时区
|
### mysql中的时区
|
||||||
在默认情况下,对于每个Connection,当前时区为mysql server的时区。但是,Connection时区也可以针对每个Connection单独设置(在jdbc:mysql://{server}:{port}/{db_name}?{追加参数}中单独设置)。
|
在默认情况下,对于每个Connection,当前时区为mysql server的时区。但是,Connection时区也可以针对每个Connection单独设置(在jdbc:mysql://{server}:{port}/{db_name}?{追加参数}中单独设置)。
|
||||||
> 由于时区统一转化为UTC后再存储于数据库中,那么在存储了timestamp之后,若再次访问timestamp时时区发生了改变,那么将存储的UTC时区timestamp转化为Connection对应时区时,转化后时区时间和存储时的时区时间并不相同。
|
> 由于时区统一转化为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'。
|
对于无效的time、datetime、timestamp值,会将其转化为该类型默认的‘0’值,例如'0000-00-00'或者'0000-00-00 00:00:00'。
|
||||||
|
|
||||||
## tmestamp转化为datetime
|
### tmestamp转化为datetime
|
||||||
可以通过cast()函数和at time zone操作符将timestamp类型转化为datetime类型。
|
可以通过cast()函数和at time zone操作符将timestamp类型转化为datetime类型。
|
||||||
```sql
|
```sql
|
||||||
SELECT col,
|
SELECT col,
|
||||||
@@ -130,7 +130,7 @@ SELECT col,
|
|||||||
FROM ts ORDER BY id;
|
FROM ts ORDER BY id;
|
||||||
```
|
```
|
||||||
|
|
||||||
## mysql中date部分
|
### mysql中date部分
|
||||||
- 在mysql中,对于date类型或者timestamp或datetime中的date部分,任何标点符号都可以作为分隔符
|
- 在mysql中,对于date类型或者timestamp或datetime中的date部分,任何标点符号都可以作为分隔符
|
||||||
```sql
|
```sql
|
||||||
'10:11:12' 代表 '2010-11-12'
|
'10:11:12' 代表 '2010-11-12'
|
||||||
@@ -138,7 +138,7 @@ SELECT col,
|
|||||||
```
|
```
|
||||||
- 当date中年份只包含两位数时,若年份为00~69,则会变为2000~2069,若年份为70~99,则年份为1970~1999
|
- 当date中年份只包含两位数时,若年份为00~69,则会变为2000~2069,若年份为70~99,则年份为1970~1999
|
||||||
|
|
||||||
## time类型
|
### time类型
|
||||||
mysql中获取和展示time类型的格式为'hh:mm:ss'。time的范围为'-838:59:59' 到 '838:59:59'。
|
mysql中获取和展示time类型的格式为'hh:mm:ss'。time的范围为'-838:59:59' 到 '838:59:59'。
|
||||||
> ***time范围***
|
> ***time范围***
|
||||||
> 之所以time的范围会如此之大并且支持负值,是因为time类型不仅可以用来表示一天中的时间点,还可以用来表示两个时间点之间的间隔(间隔可能超过24h,也有可能为负值)
|
> 之所以time的范围会如此之大并且支持负值,是因为time类型不仅可以用来表示一天中的时间点,还可以用来表示两个时间点之间的间隔(间隔可能超过24h,也有可能为负值)
|
||||||
@@ -147,6 +147,37 @@ mysql中获取和展示time类型的格式为'hh:mm:ss'。time的范围为'-838:
|
|||||||
- 缩写中带有冒号':'时,值将会被解释为一天中的时间点,并且,’11:12'将会被解释为'11:12:00'而不是'00:11:12'
|
- 缩写中带有冒号':'时,值将会被解释为一天中的时间点,并且,’11:12'将会被解释为'11:12:00'而不是'00:11:12'
|
||||||
- 缩写中不带冒号时,将会被解释为两个时间点之间的间隔。并且,最右边的两个数将会被解释为秒,'1112'和1112也会被解释为'00:11:12'
|
- 缩写中不带冒号时,将会被解释为两个时间点之间的间隔。并且,最右边的两个数将会被解释为秒,'1112'和1112也会被解释为'00:11:12'
|
||||||
|
|
||||||
## year类型
|
### year类型
|
||||||
在mysql 8.0.19中,不再支持year(4)这种显式指定宽度的方式已经被废弃,并且,过去支持的year(2)类型在8.0.19中也不再被支持。
|
在mysql 8.0.19中,不再支持year(4)这种显式指定宽度的方式已经被废弃,并且,过去支持的year(2)类型在8.0.19中也不再被支持。
|
||||||
> year类型支持的范围是'1901'到'2155',也可通过数字类型1901到2155指定
|
> 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***
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user