数据类型
点赞👍👍收藏🌟🌟关注💖💖
你的支持是对我最大的鼓励,我们一起努力吧!😃😃
1.数据类型分类
就如我们学习的C/C+等语言每一种都有自己的数据类型,MySQL也有自己的数据类型,常见的如下:
2.数值类型
数值类型整体是被分成:位类型、布尔类型、整数类型、浮点数类型。
下面列出来的是主要是以整型为例:
上面这么多类型其实都叫做整数类型,根据名字它们所占字节数大小是不一样的。都是MySQL这里规定好的。默认如果我们只写了tinyint、smallint等这样的,默认是有符号类型的,取值范围也和C/C++学习的对应的整数范围是一样的。如果tinyint、samllint后面加 unsigned 就代理是无符号类型。
2.1tinyint类型
我们以tinyint类型为例,剩下的整数类型都是一样的。
下面我们先建立一张表
create table if not exists t1(
num tinyint
);
表现在也建立好了,我们看到tinyint后面跟一个数字4,这是什么意思,未来其他类型后面()里面的含义我们都会说,而这个等到说约束的时候在细说,现在先不要管。
插入语句后面我们再说,现在我们先用。tinyint目前是有符号的,取值范围是-128~127,所以呢插入一些值看看情况
insert into t1 values (-128); #全列插入,不指定向那列中插
此时发现在tinyint取值范围内的数据都可以正常插入。
当我们插入取值范围外的时候,发现mysql不让我们插了。报我们超出范围了。
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
- 可以通过UNSIGNED来说明某个字段是无符号的
当前默认是有符号的,我们当然也可以建立一个无符号的啊,
create table t2(
num tinyint unsigned
);
此时就建立了一张表num字段的类型就是无符号类型,然后再插入一些数据看看情况。
我们同样发现一个问题,当我们插入这个类型的值超过了它的取值范围,mysql的做法是拦截,不让你插入。
如果在C/C++中向一个char类型插入比它取值范围还大的数据 , 如char a=1234567;此时会发生截断然后放进去。
如果我们向mysql特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作! MySQL必须保证插入数据的完整性,一旦截断,那在MySQL中有些是成功插入的有些是截断后插入的,那作为用户来讲,他还能信任MySQL中插入的数据吗?
反过来,如果我们已经有数据被成功插入到mysql中,一定是插入的时候合法的!
所以mysql中,一般而言,数据类型本身也是一种:约束!
约束 —> 倒逼程序员尽可能进行正确插入。所以约束,约束的是使用者。另外如果你不是一个很好的使用者,mysql也能保证数据插入的合法性。
这样的话就能保证数据库中的数据是可预期,完整的。
以tinyint为例,它是有符号的,所以可预期的是未来插入的值范围一定在-128~127的。并且数据是完整的没有发生过截断或者隐式类型转化。
我们还可以发现一个细节,mysql表中建立属性列, 列名称在前 类型在后 如 num tinyint ,如果反过来就是C/C++那一套形式。
tinyint我们说完了,其他类型自己推导。
注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。
不过我们还是结合具体场景来使用类型。
2.2bit类型
基本语法:
bit [ (M) ] :位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
位类型,M表示比特位的位数。比如一个比特位取值范围0-1,两个比特位取值范围0-3,四个比特位取值范围0-15
create table t3(
id int,
online bit(1)
);
用一个比特位表示这个用户是否在线
因为我们只有一个比特位,只能插0或1,插入其他的都不行超过范围了。
当我们查一下t3这个表的内容,我们发现