4.数据类型

数据类型约束

如果我们向mysql特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作。
反过来意味着,我们已经有数据成功插入到mysql了,一定插入的时候都是合法的。

因此,mysql中,一般而言,数据类型本身也是一种:约束(保证数据库中数据是可预期,完整的)
倒逼程序员,让程序员尽可能进行正确的插入。

整形

在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。

tinyint:一字节,范围-128~127,无符号范围0~255

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

bit数值不显示原因:ASCII码显示(mysql5.7),有的字符为不可显字符

解决方案:select id,hex(bit) from 表名; 查找时:转成十进制表示

mysql 8.0.43显示16进制

小数类型

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

  • 举例:float(4, 2),范围是-99.99 ~ 99.99。
  • 插入99.994,可以成功插入,因为四舍五入成了99.99
  • 插入99.995,插入不了,越界。

如果是 float(4,2) unsigned ,范围是 0~99.99。

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

作用:比float更加精确

说明:float表示的精度大约是7位。
decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。

字符串类型

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

特别注意:长度是和编码集相关的,例如utf8mb3的字符长度是3字节,char(L),L是标识字符的上限个数。

varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
特别注意:这个长度是指最大字节数65535,但有1~3个字节是用来存储长度的,所以有效字节数是65532

举例:按照utf8mb3来表示,3字节,65532/3=21844个字符,理论上最多是可以存21844个字符。

**细节点:****mysql的行也是有长度上限的,上限也是65535。**因此如果有2列及以上,有效字节数是小于65532的。

char vs varchar

char:效率高,固定字节数,一块完整开辟

varchar:效率低,可变长度,用多少开多少,因为可变,维护成本高。

日期类型

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

特别注意:timestamp使用时,如果要插入时自动设置时间戳,要建表时设置默认值为CURRENT_TIMESTAMP,即列名 timestamp default CURRENT_TIMESTAMP。但这仅仅只在插入时起效果,如果想在更新时也起效果,需要设置:列名 timestamp default CURRENT_TIMESTAMP ++on update++ CURRENT_TIMESTAMP.

enum 和 set 类型

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

作用:单选一个(也可以为NULL)

插入方式:

1)直接指定选项插入

2)用数字,数字值表示的就是选项几,上限65535

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

1)选项插入,例:values('选项值1,选项值2')

**2)数字插入。位图式的插入,比如插入选项1,指定1;选项2,指定2;选项3,指定4。类似:000 -> 001(选项1),000 -> 010(选项2),000 -> 110(选项2,,选项3)**选项上限为64个

说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读。

特别地:因为集合类型可以选择多个,where字句指定选项选择的话,只能选择100%匹配的。如果想选择包含单个选项的,方法:find_in_set(sub, str_list);

相关推荐
s_daqing7 分钟前
ubuntu(arm,手机)安装mysql
arm开发·mysql·ubuntu
廋到被风吹走14 分钟前
【数据库】【Mysql】慢SQL深度分析:EXPLAIN 与 optimizer_trace 全解析
数据库·sql·mysql
heze091 小时前
sqli-labs-Less-16自动化注入方法
mysql·网络安全·自动化
小冷coding10 小时前
【MySQL】MySQL 插入一条数据的完整流程(InnoDB 引擎)
数据库·mysql
周杰伦的稻香13 小时前
MySQL中常见的慢查询与优化
android·数据库·mysql
·云扬·15 小时前
MySQL 常见存储引擎详解及面试高频考点
数据库·mysql·面试
何以不说话16 小时前
mysql 的主从复制
运维·数据库·学习·mysql
橘子1317 小时前
MySQL库的操作(二)
数据库·mysql·oracle
·云扬·17 小时前
MySQL各版本核心特性演进与主流分支深度解析
数据库·sql·mysql
田超凡18 小时前
深入理解MySQL_6 Temporary临时表
mysql·java-ee