MySQL:数据类型

1. 数据类型分类

2. 数值类型

MySQL中的数值类型与C/C++中的很相似,并且也有unsigned类型

2.1 tinyint

该类型的值的取值范围为[-128, 127], 无符号的范围为[0, 255]。

 从下图可以看到,符合规定的数据将被添加到表中

当我们在向MySQL表中特定的类型中插入不合法的数据时,MySQL一般都是直接拦截的,不让我们做对应的插入。 --- 数据类型也是一种约束。

  • 整型可以指定是有符号和无符号的,默认是有符号的
  • 通过unsigned来说明某个字段是无符号的

其他的整型类型可以自己试一下,与tinyint是类似的

2.2 bit类型

基本语法:

bit [(M)] : 位字段类型,M表示每个值的位数,范围: 1-64。[]中的内容是可以省略的, 则默认M为1。

上图中,我们创建了一个表t2,明明在online字段插入了0、1,为什么没有显示呢?

bit的使用事项:

  • 比特字段在显示时,是按照ASCII码对应的值显示的
  • 当我们在只存放0/1这样的数值时,可以定义bit(1),从而节省空间
  • 可以使用 select id, hex(online) from t2; 来显示bit类型的值。
    hex(online): 这个函数将 online 列的二进制数据转换为其十六进制字符串表示形式
  • 若在创建表时,将bit的值设置超出界限,会报错:

2.3 小数类型

2.3.1 float

基本语法:

float[(m, d)] [unsigned] : MM指定的显示长度,d指定的小数位数,占用空间4个字节

如上图所示,创建了一个表,包含小数类型的字段score,宽度:4,小数位数:2;由上图可以知道,该字段范围为[-99.99, 99.99],当插入数据不够两位小数时会补0;当插入数据小数超过两位时,四舍五入(且要保证四舍五入后的数据要合法,否则报错)。

假设定义的为 float(4, 2) unsigned 时,其范围为[0, 99.99];

注:double与float相似,可以自己尝试,但是double的精度要高得多。

2.3.2 decimal

基本语法:

decimal(m, d) [unsigned0 : m指定长度,d表示小数点的位数

  • decimal(5, 2) 表示的范围是 -999.99~999.99
  • decimal(5, 2) unsigned 表示的范围为:0~999.99
  • decimal与float很像,但是表示的精度不同。

由上图可以看出,虽然float指出宽度为20,小数点位数为10,但是存储到的float数值精度大约是7位,而decimal的精度就高的多了。

  • float表示的精度大约是7位
  • decimal整数最大位数位65,支持的小数最大位数d是30;如果d被省略,默认为0,如果m被省略,默认是10;
  • 如果希望小数的精度高,则使用decimal。

3. 字符串类型

3.1 char

基本语法:

char(L):固定长度字符串,L是可以存储的长度,单位为字符(一个符号:字母、数字、汉字、符号...),最大长度值可以是255

3.2 varchar

基本语法:

varchar(L):可变长度字符串,L表示字符长度,最大长度65535个字节 -- 这里要注意是字节

L:为上限,若只用了一个字符们则指分哦欸一个字符的空间

观察上图,我们明明说vachar长度可以指定到0~65535之间,那为什么上面会报错呢?

其实是这样的,L的值与表的编码格式(charset)密切相关

  •  varchar长度可以指定到0~65535之间,但是有1~3个字节是用于记录数据大小,所以说有效字节数为65532
  • 当我们的表的编码为utf8时,varchar(L)的参数L最大值为65532/3=21844(在utf8中,一个字符占3个字节);如果编码是gbk,varchar(L)的参数L的最大值是65532/2=32766(gbk中一个字符占2个字节)。

3.3 char和varchar比较

如何选择定长或变长字符串?
  • 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  • 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
  • 定长的磁盘空间比较浪费,但是效率高。
  • 变长的磁盘空间比较节省,但是效率低。
  • 定长的意义是,直接开辟好对应的空间
  • 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少

4. 日期和时间类型

常用的日期有如下三个:

  • date:日期'yyyy-mm-dd',占用3字节
  • datetime:时间日期格式 'yyyy-mm-dd HH:jj:ss' 表示范围从1000到9999,占用8字节
  • timestamp:时间戳,从1970年开始的'yyyy-mm-dd HH:jj:ss'格式和datastamp完全一致,占用4字节,表中包含此字段时无需更改,对相关记录的更改会自动更新这个值

无需对timestamp类型的值进行修改,会自动修改

5. enum和set

基本语法:

enum:枚举,“单选类型”;

enum('选项1', '选项2', '选项3', ...);

该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值;而出于效率考虑,这些值实际存储的是数字,因为这些选项的每个选项值依次对应以下数字:1,2,3...... 最多65535个;当我们添加枚举值时,也可以添加对应的数字编号。

set:集合,“多选”类型

该设定只是提供了若干个选项的值,最终一个单元格内,设计可存储了其中任意多个值;而且出于效率,这些值存储的都是”数字",因为这些选项的每个选项依次对应如下数字:1,2,4,8......,最多64个。

在插入时一定要注意字符的大小写,否则会出错。set类型可以一次插选择多个选项。在插入时,我们也可以用数字进行插入数据,如下:

有如下数据,从中查询喜欢游戏的人: 

使用如下查询语句:

 

只能查出只喜欢游戏的人,不能查询出所有,我们可以使用下面的语句:

集合查询使用函数:

find_in_set(sub, str_list):如果sub在str_list中,则返回下标;否则返回0; str_list为使用逗号分割的字符串

  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值