日常提交

This commit is contained in:
2022-09-28 00:47:37 +08:00
parent fb70f94d30
commit 91785d6590

View File

@@ -100,7 +100,7 @@ CREATE TABLE t1 (t TIME(3), dt DATETIME(6), ts TIMESTAMP(0));
> 可以通过为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指定
### timestamp类型和datetime类型自动初始化和更新
对于timestamp类型和datetime类型可以被自动初始化和更新到当前的时间。
> 当对timestamp或者datetime字段设置了on update current_timestamp时若某行中任一其他列的值发生变化该列变化前后值不同那么设置了on update的datetime或timestamp字段会更新到当前时间。若update前后所有的列值都与修改之前相同那么即使执行了update操作on update列的时间也不会更新。
> ***如果想要防止设置了on update的列在其他列被修改时更新为当前时间可以显式将该列设置为该列当前的值。***
> ```sql
> # 即使dt被设置了on updateid变更后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***