数据类型

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 年某时

注意,注意,注意

  1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入。
  2. 插入年份时,尽量使用4位值。
  3. 插入两位年份时,<=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的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。下面就来总结一下两种日期类型的区别。

  1. DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
  2. DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,> 操作系统以及客户端连接都有时区的设置。
  3. DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率> 更高。
  4. 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 (2
24 − 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  |            |
+------+--------+-------+------------+

posted @ 2018-04-23 14:37  哈哈大圣  阅读(159)  评论(0编辑  收藏  举报