史上最全的mysql数据类型汇总(下)
接着上文继续来梳理,上文我们写到了日期与时间类型中的time
类型,然后我们接着来写日期与时间类型中的date
类型。
date类型
date
类型用在仅需要日期值时,没有时间部分,在存储时需要3字节。
日期格式为
YYYY-MM-DD
。其中
YYYY
表示年,
MM
表示月,
DD
表示日。
(1)以 'YYYY-MM-DD' 或者 'YYYYMMDD' 字符串格式表示的日期,取值范围为 '1000-01-01' ~ '9999-12-3' ;例如输入'2022-12-31'或者‘20221231’,插入数据库的日期都为2022-12-31;
(2)以‘YY-MM-DD’或者‘YYMMDD’字符串格式表示的日期,在这里‘YY’表示两位的年值。包含两位年值的日期会令人模糊,因为不知道世纪。
mysql
使用以下规则解释两位年值:‘00~69’范围的年值转换为
2000-2069
,'70-99'范围的年值转换为
1970~1999
。
(3)以YY-MM-DD或者YYMMDD数字格式表示的日期,与前面相似,00~69范围的年值转换为2000~2069,70~99范围的年值转换为1970~1999。
(4)使用
CURRENT_DATE
或者
NOW()
,插入当前系统日期。
举个例子:
创建一个名为
yunweijia_4
的数据表;
mysql> create table yunweijia_4 (d date);
Query OK, 0 rows affected (0.03 sec)
mysql>
向表中插入一些值;
mysql> insert into yunweijia_4 values ('1999-09-09'), ('19990909'), ('20221010');
Query OK, 3 rows affected (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>
然后查看下结果:
mysql> select * from yunweijia_4;
+------------+
| d |
+------------+
| 1999-09-09 |
| 1999-09-09 |
| 2022-10-10 |
+------------+
3 rows in set (0.00 sec)
mysql>
再举个例子:
删除数据表
yunweijia_4
中的数据;
delete from yunweijia_4;
在表中插入数据;
mysql> insert into yunweijia_4 values ('99-09-09'), ('990909'), ('000101'), ('111111');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql>
查看下结果:
mysql> select * from yunweijia_4;
+------------+
| d |
+------------+
| 1999-09-09 |
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
4 rows in set (0.00 sec)
mysql>
又举个例子:
老规矩,先删除表中的数据
mysql> delete from yunweijia_4;
Query OK, 4 rows affected (0.01 sec)
mysql>
向表中插入数据;
mysql> insert into yunweijia_4 values (19990909), (990909), (000101), (111111);
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0
mysql>
查看下结果:
mysql> select * from yunweijia_4;
+------------+
| d |
+------------+
| 1999-09-09 |
| 1999-09-09 |
| 2000-01-01 |
| 2011-11-11 |
+------------+
4 rows in set (0.00 sec)
mysql>
又又举个例子:
删除表中数据;
mysql> delete from yunweijia_4;
Query OK, 4 rows affected (0.01 sec)
mysql>
插入系统当前时间:
mysql> insert into yunweijia_4 values (current_date()), (now());
Query OK, 2 rows affected, 1 warning (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 1
mysql>
查看结果:
mysql> select * from yunweijia_4;
+------------+
| d |
+------------+
| 2022-07-09 |
| 2022-07-09 |
+------------+
2 rows in set (0.00 sec)
mysql>
CURRENT_DATE
只返回当前日期值,不包括时间部分;
NOW()
函数返回日期和时间值,在保存到数据库时,只保留了其日期部分。
datetime类型
DATETIME
类型用于需要同时包含日期和时间信息的值,在存储时需要8字节。日期格式为‘YYYY-MM-DD HH:MM:SS’。其中,
YYYY
表示年,
MM
表示月,
DD
表示日,
HH
表示小时,
MM
表示分钟,
SS
表示秒。在给
DATETIME
类型的字段赋值时,可以使用字符串类型或者数字类型的数据插入,只要符合
DATETIME
的日期格式即可。
(1)以‘YYYY-MM-DD HH:MM:SS’或者‘YYYYMMDDHHMMSS’字符串格式表示的值,取值范围为‘1000-01-01 00:00:00’~‘9999-12-3 23:59:59’;
(2)以‘YY-MM-DD HH:MM:SS’或者‘YYMMDDHHMMSS’字符串格式表示的日期,在这里YY表示两位的年值。与前面相同,‘00~69’范围的年值转换为‘2000~2069’,‘70~99’范围的年值转换为‘1970~1999’。
(3)以YYYYMMDDHHMMSS或者YYMMDDHHMMSS数字格式表示的日期和时间。
TIMESTAMP类型
TIMESTAMP
的显示格式与
DATETIME
相同,显示宽度固定在19个字符,日期格式为
YYYY-MM-DD HH:MM:SS
,在存储时需要4字节。
TIMESTAMP
列的取值范围小于
DATETIME
的取值范围,为‘1970-01-01 00:00:01’UTC~‘2038-01-1903:14:07’UTC。其中,
UTC(Coordinated Universal Time)
为世界标准时间,因此在插入数据时,要保证在合法的取值范围内。
注意点:
由于datetime
类型和TIMESTAMP
和上面的用法大差不差,所以这里就不再一一举例了。
文本字符串类型
字符串类型用来存储字符串数据,除了可以存储字符串数据之外,还可以存储其他数据,比如图片和声音的二进制数据。
mysql
支持两类字符串数据:文本字符串和二进制字符串;
文本字符串可以进行区分或者不区分大小写的串比较,还可以进行模式匹配查找。
在
mysql
中,文本字符串类型指的是:
-
CHAR
-
VARCHAR
-
TEXT
-
ENUM
-
SET
详细可以看下表:
VARCHAR
和
TEXT
类型与
BLOB
都是
变长类型
,其存储需求
取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸
。
例如,一个
VARCHAR(10)
列能保存最大长度为10个字符的字符串,实际的存储需要是字符串的长度L加上1字节(记录字符串的长度)。对于字符“abcd”,L是4而存储要求是5字节。
CHAR和VARCHAR类型
CHAR(M)
为固定长度字符串,在定义时指定字符串列长。当保存时在右侧填充空格,以达到指定的长度。
M
表示列长度,
M
的范围是0~255个字符。
例如:
CAHR(4)
定义了一个固定长度的字符串列,其包含的字符个数最大为4。当检索到
CHAR
值时,尾部的空格将被删除。
VARCHAR(M)
是长度可变的字符串,
M
表示最大的列长度。
M
的范围是0~65535。
VARCHAR
的最大实际长度由最长的行的大小和使用的字符集确定,而其实际占用的空间为字符串的实际长度加1。
例如:
VARCAHR(50)
定义了一个最大长度为50的字符串,如果插入的字符串只有10个字符,则实际存储的字符串为10个字符和一个字符串结束字符。
VARCHAR
在对应值保存和检索时尾部的空格仍保留。
我们看下
CHAR(4)
和
VARCHAR(4)
存储的区别是什么:
从上图的对比结果可以看到,
CHAR(4)
定义了固定长度为4的列,不管存入的数据长度为多少,所占用的空间均为4个字节;
VARCHAR(4)
定义的列所占的字节数为实际长度加1;
但是查询时是不同的,我们可以通过下面的例子来看下;
举个例子:
创建一个名为
yunweijia_5
的数据表;
mysql> create table yunweijia_5 (ch char(4), var varchar(4));
Query OK, 0 rows affected (0.03 sec)
mysql>
在这个数据表中插入一些数据;
mysql> insert into yunweijia_5 values ('ab', 'ab');
Query OK, 1 row affected (0.01 sec)
mysql>
查看下结果:
mysql> select concat ('(', ch, ')'), concat ('(', var, ')') from yunweijia_5;
+-----------------------+------------------------+
| concat ('(', ch, ')') | concat ('(', var, ')') |