数据类型
2.日期类型
ps:如果在终端输入sql命令的时候不小心输入错了,想结束当前指令,可以加 \c结束运行,如果少了个引号,要吧引号加上"\c
日期类型
:DATE TIME DATETIME TIMESTAMP YEAR
作用
:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
日期类型|格式|能表示的范围
---|---|---|---|
YEAR|YYYY|1901/2155
DATE|YYYY-MM-DD|1000-01-01/9999-12-31
TIME|HH:MM:SS|-838:59:59/838:59:59
DATETIME|YYYY-MM-DD HH:MM:SS|1000-01-01 00:00:00/9999-12-31 23:59:59
TIMESTAMP|YYYYMMDD HHMMSS|1970-01-01 00:00:00/2037 年某时
注意,注意,注意
- 单独插入时间时,需要以字符串的形式,按照对应的格式插入。
- 插入年份时,尽量使用4位值。
- 插入两位年份时,<=69,以20开头,比如50, 结果2050 >=70,以19开头,比如71,结果1971
示例
mysql> create table t12(y year);
Query OK, 0 rows affected (0.21 sec)
mysql> insert into t12 values
-> (50), -- 插入一个两位数
-> (71);
Query OK, 2 rows affected (0.06 sec)
Records: 2 Duplicates: 0 Warnings: 0
mysql> select * from t12; -- 结果按照上面注意第三点规律显示
+------+
| y |
+------+
| 2050 |
| 1971 |
+------+
小试牛刀
++(代码中的mysql> 和 > 这两个在输入命令的时候不要输入,它们只是起到一个提示的作用而已)++
-- 创建表
create table student(
id int primary key auto_increment,
name char(6),
born_year year,
birth_date date,
class_time time,
reg_time datetime
);
desc student;
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | char(6) | YES | | NULL | |
| born_year | year(4) | YES | | NULL | |
| birth_date | date | YES | | NULL | |
| class_time | time | YES | | NULL | |
| reg_time | datetime | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
6 rows in set (0.07 sec)
-- 插入数据
-- PS:now()这个函数返回的为年月日时分秒,当前字段会根据设置的数据类型截取对应的值
insert into student values
(1,'egon',now(),now(),now(),now()),
(2,'alex',"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),
(3,'egon',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),
(4,'wsb',"1998","1998-01-01","13:13:13","2017-01-01 13:13:13")
;
mysql> select * from student;
+----+------+-----------+------------+------------+---------------------+
| id | name | born_year | birth_date | class_time | reg_time |
+----+------+-----------+------------+------------+---------------------+
| 1 | egon | 2018 | 2018-04-23 | 13:04:57 | 2018-04-23 13:04:57 |
| 2 | alex | 1995 | 1995-11-11 | 11:11:11 | 2017-11-11 11:11:11 |
| 3 | egon | 1997 | 1997-12-12 | 12:12:12 | 2017-12-12 12:12:12 |
| 4 | wsb | 1998 | 1998-01-01 | 13:13:13 | 2017-01-01 13:13:13 |
+----+------+-----------+------------+------------+---------------------+
4 rows in set (0.00 sec)
datetime与timestamp的区别
在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。
- DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
- DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,> 操作系统以及客户端连接都有时区的设置。
- DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率> 更高。
- DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not > null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且update语句中没有指定该列的更新> 值,则默认更新为当前时间。
3.字符串类型
PS:
- mySQL比较(不能混淆检索和比较)字符串默认是去掉字符串末尾的空格(char和varchar都会去掉末尾空格),只是末尾的空格!
,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'😉 ;
然而使用like的时候不会去掉后面的空格。 - char和varchar括号内的参数指的都是字符!字符!字符!的长度
- 一般char够用了,一般定长的字段发在最前面,最好不要定长边长混用
简单比较
字符类型 | 特点 | 储存范围(字符数) | 储存原理 | 检索 |
---|---|---|---|---|
char | 定长,简单粗暴,浪费空间,存取速度快 | 0-255(按照对应编码字符的个数) | 存储char类型的值时,会往右填充空格来满足长度, 储存定长,超过设置的字符数会报错! |
在检索或者查询时,查出的结果会自动删除尾部的空格, 除非我们打开pad_char_to_full_length SQL模式 |
varchar | 变长,精准,节省空间,存取速度慢 | 0-65535(如果大于21845会提示用其他类型 。 mysql行最大限制为65535字节,字符编码为utf-8 |
varchar类型存储数据 的真实内容(包括尾部空格);varchar类型会在真实数据前加1-2Bytes的 前缀表示真实数据的bytes字节数 |
尾部有空格会保存 下来,在检索或者说查询时,也会正常显示包含空格在内的内容 |
示例
create table t13(name char(5));
create table t14(name varchar(5));
insert into t13 values('李杰 '); -- '李杰 '
insert into t14 values('李杰 '); -- '李杰 '
select char_length(name) from t13; -- char_length(name)查询数据字符长度 length()是查看字节数
select char_length(name) from t14; -- 3
select name from t13 where name='李杰';
select name from t13 where name like '李杰';
底层储存原理模拟
name char(5)
egon |alex |wxx | --用空格填充到指定长度
name varchar(5) -- 在头存储字符串大小,最大占2个字节
1bytes+egon|1bytes+alex|1bytes+wxx|
演示
1. char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格
(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形
mysql> create table t1(x char(5),y varchar(5));
-- char存5个字符,而varchar存4个字符
mysql> insert into t1 values('你瞅啥 ','你瞅啥 ');
mysql> SET sql_mode='';
-- 在检索时char很不要脸地将自己浪费的2个字符给删掉了,装的好像自己没浪费过空间一样,而varchar很老实,存了多少,就显示多少
mysql> select x,char_length(x),y,char_length(y) from t1;
+-----------+----------------+------------+----------------+
| x | char_length(x) | y | char_length(y) |
+-----------+----------------+------------+----------------+
| 你瞅啥 | 3 | 你瞅啥 | 4 |
+-----------+----------------+------------+----------------+
-- 略施小计,让char现出原形
mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
-- 这下子char原形毕露了......
mysql> select x,char_length(x),y,char_length(y) from t1;
+-------------+----------------+------------+----------------+
| x | char_length(x) | y | char_length(y) |
+-------------+----------------+------------+----------------+
| 你瞅啥 | 5 | 你瞅啥 | 4 |
+-------------+----------------+------------+----------------+
mysql> select x,length(x),y,length(y) from t1;
+-------------+-----------+------------+-----------+
| x | length(x) | y | length(y) |
+-------------+-----------+------------+-----------+
| 你瞅啥 | 11 | 你瞅啥 | 10 |
+-------------+-----------+------------+-----------+
1 row in set (0.00 sec)
-- char类型:3个中文字符+2个空格=11Bytes
-- varchar类型:3个中文字符+1个空格=10Bytes
2. 虽然 CHAR 和 VARCHAR 的存储方式不太相同,但是对于两个字符串的比较,都只比 较其值,忽略 CHAR 值存在的右填充,即使将 SQL _MODE 设置为 PAD_CHAR_TO_FULL_ LENGTH 也一样,,但这不适用于like
mysql> CREATE TABLE names (myname CHAR(10));
mysql> INSERT INTO names VALUES ('Monty');
mysql> SELECT myname = 'Monty', myname = 'Monty ' FROM names;
+------------------+--------------------+
| myname = 'Monty' | myname = 'Monty ' |
+------------------+--------------------+
| 1 | 1 |
+------------------+--------------------+
mysql> SELECT myname LIKE 'Monty', myname LIKE 'Monty ' FROM names;
+---------------------+-----------------------+
| myname LIKE 'Monty' | myname LIKE 'Monty ' |
+---------------------+-----------------------+
| 0 | 0 |
+---------------------+-----------------------+
总结
常用字符串系列
:char与varchar
PS:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
其他字符串系列
(了解)(效率:char>varchar>text)
TEXT系列: TINYTEXT TEXT MEDIUMTEXT LONGTEXT
BLOB 系列: TINYBLOB BLOB MEDIUMBLOB LONGBLOB
BINARY系列 :BINARY VARBINARY
text:text数据类型用于保存变长的大字符串,可以组多到65535 (216 − 1)个字符。
mediumtext:A TEXT column with a maximum length of 16,777,215 (224 − 1) characters.
longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**32 − 1) characters.
4.枚举类型
枚举类型
: enum 、set
用途
: 特定字符串表示的值,比如性别、星座、爱好
枚举类型 | 特点 | 备注 |
---|---|---|
enum | 单选 | 只能在给定的范围内选一个值,如性别gender 男male/女female |
set | 多选 | 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...) 注意set的传值,将中间所有的冒号去掉 |
用例
create table consumer(
name varchar(50),
sex enum('male','female'),
level enum('vip1','vip2','vip3','vip4','vip5'), -- 在指定范围内,多选一
hobby set('play','music','read','study') -- 在指定范围内,多选多
);
insert into consumer values
('egon','male','vip5','read,study'), -- 注意set的传值,将中间所用的冒号去掉
('alex','female','vip1','girl') -- 如果传入的不在枚举类型里面,默认存空
;
select * from consumer;
+------+--------+-------+------------+
| name | sex | level | hobby |
+------+--------+-------+------------+
| egon | male | vip5 | read,study |
| alex | female | vip1 | |
+------+--------+-------+------------+