数据库基础---数据类型
一 介绍
存储引擎决定了表的类型,而表内存放的数据也要有不同的类型,每种数据类型都有自己的宽度,但宽度是可选的
=============================== 数据类型 约束 ===================================== 1 整数类型====TINYINT SMALLINT MEDIUMINT INT BIGINT 1个字节8个二进制位 2 3 4 8 作用 : 储存年龄 等级 id 号码 create table t2(id int(10)) ||| int(10) 整型的宽度是 显示的宽度 ===== 不是存储宽度INT(4*8 32位) ||| 插入的数据超过范围 会储存最大值 (默认是有符号的) ||| 默认显示宽度是 10 刚好是 4个字节的数据最大值长度 +-------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+-------------+------+-----+---------+-------+ | id | tinyint(10) | YES | | NULL | | +-------+-------------+------+-----+---------+-------+ +-------+------------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------+------------------+------+-----+---------+-------+ | id | int(10) unsigned | YES | | NULL | | +-------+------------------+------+-----+---------+-------+ ======================================================================================================================================================= 2 浮点类型====float double decimal 薪资 身高 体重 体质参数 create table t_float(weight float(255,30) unsigned); # 255 存储总宽度 30 小数的长度 create table t_float(weight double(255,30) unsigned); create table t_float(weight decimal(65,30) unsigned); ======================================================================================================================================================= 3 日期类型 DATE TIME DATETIME TIMESTAMP YEAR 作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等 DATE:2017-11-11 出生年月日 TIME:10:14:11 上课时间 DATETIME:2017-11-11 10:14:11 注册时间,文章发布时间,员工入职时间 TIMESTAMP:2017-11-11 10:14:11 YEAR :1970 出生年 create table t10( born_date date, class_time time, reg_time datetime, born_year year ); insert into t10 values ('1999-11-11','08:30:00','2017-11-11 11:11:11',2011); insert into t10 values (now(),now(),now(),now()); #了解:datetime与timestamp create table t11( x datetime, y timestamp ); desc t11; mysql> desc t11; +-------+-----------+------+-----+-------------------+-----------------------------+ | Field | Type | Null | Key | Default | Extra | +-------+-----------+------+-----+-------------------+-----------------------------+ | x | datetime | YES | | NULL | | | y | timestamp | NO | | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP | +-------+-----------+------+-----+-------------------+-----------------------------+ 2 rows in set (0.01 sec) mysql> insert into t11 values(null,null); Query OK, 1 row affected (0.04 sec) mysql> select * from t11; +------+---------------------+ | x | y | +------+---------------------+ | NULL | 2017-10-23 10:25:07 | +------+---------------------+ 1 row in set (0.00 sec) mysql> insert into t11 values('1011-11-11','1011-11-11'); Query OK, 1 row affected, 1 warning (0.05 sec) mysql> select * from t11; +---------------------+---------------------+ | x | y | +---------------------+---------------------+ | NULL | 2017-10-23 10:25:07 | | 1011-11-11 00:00:00 | 0000-00-00 00:00:00 | +---------------------+---------------------+ ======================================================================================================================================================= 4 字符串 char 类型 0-255 ==== 定长 确定存储长度===快--浪费空间 varchar 类型 0-21845 === 变长 精准 ---节省空间 --慢 添加了 额外的标记 ======================================================================================================================================================= 5 枚举类型 集合 类型 enum--单选 set---多选 =======================================================================================================================================================
数值类型
整数类型:TINYINT SMALLINT MEDIUMINT INT BIGINT
作用:存储年龄,等级,id,各种号码等
!!!注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下
其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
默认的显示宽度,都是在最大值的基础上加1
int的存储宽度是4个Bytes,即32个bit,即2**32
无符号最大值为:4294967296-1
有符号最大值:2147483648-1
有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的
最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok
定点数类型 DEC等同于DECIMAL
浮点类型:FLOAT DOUBLE
作用:存储薪资、身高、体重、体质参数等
位类型:BIT
BIT(M)可以用来存放多位二进制数,M范围从1~64,如果不写默认为1位。
注意:对于位字段需要使用函数读取
bin()显示为二进制
hex()显示为十六进制
三 日期类型
DATE TIME DATETIME TIMESTAMP YEAR
作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等
四 字符串类型
#官网:https://dev.mysql.com/doc/refman/5.7/en/char.html #注意:char和varchar括号内的参数指的都是字符的长度 #char类型:定长,简单粗暴,浪费空间,存取速度快 字符长度范围:0-255(一个中文是一个字符,是utf8编码的3个字节) 存储: 存储char类型的值时,会往右填充空格来满足长度 例如:指定长度为10,存>10个字符则报错,存<10个字符则用空格填充直到凑够10个字符存储 检索: 在检索或者说查询时,查出的结果会自动删除尾部的空格,除非我们打开pad_char_to_full_length SQL模式(SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';) #varchar类型:变长,精准,节省空间,存取速度慢 字符长度范围:0-65535(如果大于21845会提示用其他类型 。mysql行最大限制为65535字节,字符编码为utf-8:https://dev.mysql.com/doc/refman/5.7/en/column-count-limit.html) 存储: varchar类型存储数据的真实内容,不会用空格填充,如果'ab ',尾部的空格也会被存起来 强调:varchar类型会在真实数据前加1-2Bytes的前缀,该前缀用来表示真实数据的bytes字节数(1-2Bytes最大表示65535个数字,正好符合mysql对row的最大字节限制,即已经足够使用) 如果真实的数据<255bytes则需要1Bytes的前缀(1Bytes=8bit 2**8最大表示的数字为255) 如果真实的数据>255bytes则需要2Bytes的前缀(2Bytes=16bit 2**16最大表示的数字为65535) 检索: 尾部有空格会保存下来,在检索或者说查询时,也会正常显示包含空格在内的内容
Value | CHAR(4) | Storage Required | VARCHAR(4) | Storage Required |
---|---|---|---|---|
'' |
' ' |
4 bytes | '' |
1 byte |
'ab' |
'ab ' |
4 bytes | 'ab' |
3 bytes |
'abcd' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
'abcdefgh' |
'abcd' |
4 bytes | 'abcd' |
5 bytes |
测试前了解两个函数 length:查看字节数 char_length:查看字符数
1. char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形
2. 虽然 CHAR 和 VARCHAR 的存储方式不太相同,但是对于两个字符串的比较,都只比 较其值,忽略 CHAR 值存在的右填充,即使将 SQL _MODE 设置为 PAD_CHAR_TO_FULL_ LENGTH 也一样,,但这不适用于like
3. 总结
#常用字符串系列:char与varchar 注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡 #其他字符串系列(效率:char>varchar>text) TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT BLOB 系列 TINYBLOB BLOB MEDIUMBLOB LONGBLOB BINARY系列 BINARY VARBINARY text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**16 − 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.
五 枚举类型与集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)