小白终是踏上了这条不归路----小文的mysql学习笔记(15)----常见的数据类型
**
小白终是踏上了这条不归路----小文的mysql学习笔记(1)
小白终是踏上了这条不归路----小文的mysql学习笔记(2)----条件查询
小白终是踏上了这条不归路----小文的mysql学习笔记(3)----排序询查
小白终是踏上了这条不归路----小文的mysql学习笔记(4)----常见的基本函数
小白终是踏上了这条不归路----小文的mysql学习笔记(5)----分组查询
…
…
小白终是踏上了这条不归路----小文的mysql学习笔记(目录)
**
突然不小心就断更两天,课有点多,【狗头保命】,前面我们在创建表的时候不是在写了表的列名之后要加上表的列类型嘛,那今天我们来学习mysql中的数据类型,看看小文的笔记
**
常见的数据类型
数值型: 整型,
小数: 定点数
浮点数
字符型: .
较短的文本: char、 varchar
较长的文本: text、 blob (较长的二进制数据)
日期型:
选取什么类型的原则:
所选择的类型越简单越好,能保存数值的类型越小越好。
一、整型
字节 | 整型 | 范围 |
---|---|---|
1 | Tinyint | 有符号:-128~127;无符号: 0~255 |
2 | Smallint | 有符号:-32768~32767;无符号: 0~65535 |
3 | Mediumint | 有符号: -8388608~8388607;无符号: 0~1677215 |
4 | Int / interger | 有符号: - 2147483648 2147483647 ; &无符号: 0~4294967295 |
5 | Bigint | 有符号:-92233720368547 75808~92233720368547 75807; 无符号: 0~9223372036854775807*2+1 |
注意事项
①如果不设置无符号还是有符号,默认是有符号,如果想设置无符号,需要添加unsigned关键字
②如果插入的数值超出了整型的范围,会报警告(8.0版本sqlyog),无法插入数据
③如果不设置长度,会有默认的长度
那么我们来演示一下举个栗子:首先我们创一个表tx然后我们顺便看一下它的结构
不设置默认是有符号的所以你可以插入负数,所以这里可以看到你是插入成功了的
那么如果要设置无符号的话就需要在建表的时候添加 unsigned 关键字,举个栗子:先把刚刚建的表删了我们再重新建 tx 表 ,插入t1,t2 两列 并查看表结构
然后我们先来插入t1 一个负数,t2一个正数成功了
但是当我们像t2插入负数时却报错了,因为我们在设置列类型时加上了 unsigend,将该列设置为了无符号,所以不能插入负数,
二、小数
一共有两类一类是浮点型,一类是定点型
浮点数类型 | 范围 | 字节 |
---|---|---|
float | 士1.75494351E 38~士3.402823466E+38 | 4 |
double | 士2.2250738585072014E-308~士1.7976931348623157E+308 | 8 |
定点数类型 | 范围 | 字节 |
DEC(M,D)/DECIMAL(M,D) | 最大取值范围与double相同,给定decimal的有效职值范围由M和D决定 | M+2 |
释一下M和D的意思:
D代表小数的位数,如果多了便会四舍五入保留D位小数,如果少了不够D位那么会自动用0来填充
M代表整数和小数一共加起来的位数,不能超过M(小文的是8.0当你超过M位数时是不会插入临界值,当然也不会插入数据)
(M,D) 可以省略,如果是float和double则会根据插入的数值的位数来确定位数;
如果是 DECIMAL M默认是10,D默认是0。
定点型的精确度较高,如果要求插入数值的精度较高如货币运算等就考虑使用.
那么我们来举个栗子:咱们先把上面建的fpx表删了,然后重新建一个fpx表,不设置(M,D)将他们省略
然后我们来看看表结构你可以发现设置declmal的x3 的长度默认是(10,0)
然后我们来插入三个数据会发现 x3 出现警告,然后我们查看表中数据会发现设置了declmal的x3列中的数据被四舍五入保留整数了
三、字符型
较短的文本:char 和 varchar
类型 | 范围 | 最多字符数 |
---|---|---|
char(M) | M为0~ 255之间的整数 | M |
varchar(M) | M为0~65535之间的整数 | M |
二者的区别:
char(M) 是固定长度的字符,M可以省略默认为一,虽然比较占空间,但是效率较高;
varchar(M) 是可变长度的字符,M不可以省略,相比于char 更节省空间,但是效率相对较低。
解释:
这里char的固定长度字符的意思就是:加入你设置了char(6);然后你插入的数据只要两个字符“aa”但是她是固定长度字符,所以系统还是会给你开六个的字符位置 ; 而varchar(M)是可变长度字符,M是它的最大字符数,只要在M内,你插入几个字符,那系统就给你开几个字符的位置,
补充:
1、binary和varbinary类型(用于保存较短的二进制)
说明: 类似于char和varchar,不同的是它们包含二进制字符串而不包含非二进制字符串。
2、Enum类型,
说明:又称为枚举类型,要求插入的值必须属于列表中指定的值之一。(不区分大小写)
这里我们举个栗子:我们先创建一个tgp表,
然后再分别插入三个数据 a B M
然后我们查询表中数据你会发现,只有属于列表中的数据被插入了,而不符合列表的数据M是没有被插入表中而是报错。
3、Set类型(用于保存集合)
说明:和Enum类型类似,里面可以保存0~64个成员。和Enum类型最大的区
别是: SET类型一次可以选取多个成员,而Enum只能选一个
根据成员个数不同,存储所占的字节也不同(和enum一样不会区分大小写)
成员数 字节数
1~8 1
9~16 2
17~24 3
25~32 4
33~64 8
那么我们同样来举个栗子:我们想建一个ig表
然后向里面插入数据 可以看出,用set可以同时插入多个列表中的数据,而上面的enum型不同,enum这样会报错只能单个插入
四、日期型
日期和日期类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
date | 4 | 1000-01-01 | 9999-1231 |
datetime | 8 | 1000-01-01 00:00:00 | 9999-12 -31 23: 59:59 |
timestamp | 4 | 1 9700101 080001 | 2038年的某个时刻 |
time | 3 | -838 :59:59 | 838: 59:59 |
year | 1 | 1901 | 2155 |
date只保存日期
time 只保存时间
year只保存年
datetime保存日期+时间(不受时区影响)
timestamp保存日期+时间(受时区影响)
Timestamp和datetime区别:
1、Timestamp支 持的时间范围较小,取值范围19700101080001- – 2038年的某个时间
Datetime的取值范围: 1000-1-1 --9999- 12-31
2、timestamp和实际时区有关,更能反映实际的日期
而datetime则只能反映出插入时的当地时区
3、timestamp的 属性受Mysq|版本和SQLMode的影响很大
那么这个区别到底是怎么肥事:我们先来举个栗子:我们先建一个tad表,t1,t2列分别设为datetime类型和timestamp类型
然后我们先来插入两个时间,查看表中数据
这里我们的两个数据一样因为我们什么都还没有设置,那我们设置一下时区
然后我们再来插入两个now现在你会发现t1没变,t2变成了该时区的地方时
**
好蜡,数据类型就这么多蜡,了解一哈就可以了
**