3.MySQL数据类型详解

个人主页:Lei宝啊

愿所有美好如期而遇


1.数据类型分类

数值类型:bit

tinyint smalliint int bigint

float double decimal

bool

文本,二进制类型:

char

varchar

text

时间日期:date datetime timestamp

String类型:

enum

set

2.数值类型

(1).tinyint,smallint类型等

事实证明,mysql不允许不合法的数据插入,-129和128超出了tinyint的范围。

接下来我们测试一下无符号tinyint的范围。

显然,变成了0~255.

(2)bit类型

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1

我们发现竟然什么都没有,为什么呢?

bit字段在显示时,是按照ASCII码对应的值显示

先将num的范围改大点

(3)小数类型

1).float

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

小数:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入

我们先不指定宽度和小数位数。

可以看出默认6位小数,再多就会丢失精度。

接下来指定一下宽度和精度。

99.9954进位后就是100.00,超出宽度,数据不合法,数据库不允许插入,精度一定会保持两位,哪怕是补两个0.

这样也可以。

接下来看一下无符号float

于是我们知道了,float(4,2) unsigned 类型的数据范围只有0~99.99

2).decimal

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

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,

默认是10。

建议:如果希望小数的精度高,推荐使用decimal。

decimal的精度很高,基本上插入几就是几,float丢失精度就比较多了。

3.字符串类型

(1)char

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255

注意:utf8中一个字符占3个字节,而gbk中一个字符占2个字节

这里的一个字符可以是数字,字母,符号和汉字,都是一个字符。

(2)varchar

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:

varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字

节数是65532。

当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占

用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符

占用2字节)。

(3)char和varchar比较

如何选择定长或变长字符串?

如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5

如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。

定长的磁盘空间比较浪费,但是效率高。

变长的磁盘空间比较节省,但是效率低。

定长的意义是,直接开辟好对应的空间

变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。

(4)日期和时间类型

date :日期 'yyyy-mm-dd' ,占用三字节
datetime :时间日期格式 'yyyy-mm-dd HH:ii:ss' 表示范围从 1000 到 9999 ,占用八字节
timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一 致, 占用四字节

先插入一个date类型的数据。

emmm?我们没插入datastamp类型的数据啊,为什么呢?这是因为他有default值,也就是默认值,当我们不插入时,默认插入现在的时间。而且就算你刻意插入NULL,插不进去,因为他不允许为空。

而且时间戳会自动更新当前时间。

(5)enum和set

enum:枚举,"单选"类型;
enum('选项1','选项2','选项3',...);

不可插入多个选项。

set:集合,"多选"类型;
set('选项值1','选项值2','选项值3', ...);

再插入几个数据。

将set里的选项当做比特位,a就是1,a,b就是11,a,b,c就是111,转换为十进制就是1,3,7

再来看一个。

这样也是可以的。

但是我们也想找包含'a'的所有项,怎么找?

集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0

首先select可以执行表达式和函数。

非0为true,而且我们看到这个函数只能查找单个字符。

这样我们就筛选出了所有爱好为a的人。

那么如何筛选爱好为a,b的人呢?

用and连接就好了。

综合举个栗子

先建个新表。

不可以这样查找。

这样查可以,但是不能够包含。

相关推荐
IvorySQL11 分钟前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
·云扬·21 分钟前
MySQL 8.0 Redo Log 归档与禁用实战指南
android·数据库·mysql
IT邦德23 分钟前
Oracle 26ai DataGuard 搭建(RAC到单机)
数据库·oracle
惊讶的猫1 小时前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i1 小时前
完全卸载MariaDB
数据库·mariadb
纤纡.1 小时前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn1 小时前
【Redis】渐进式遍历
数据库·redis·缓存
橙露2 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星2 小时前
sql语言之分组语句group by
java·数据库·sql
符哥20082 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql