MySQL基础篇:03_数据类型(列类型)

  • 数据类型:对数据进行统一的分类,从系统的角度出发为了能够使用统一的方式进行管理:更好的利用有限的空间
  • SQL中将数据类型分为3大类:数值类型、字符串类型、时间日期类型
    在这里插入图片描述

数值类型

数值类型数据:都是数值!系统将数值类型分为整数类型和小数类型

整数类型

  • 存放整型数据:在SQL中因为要更多考虑如何节省磁盘空间,所以系统将整型又细分为5类
  • tinyint:迷你整型,使用1个字节存储:常用
  • smallint:小整型,使用2个字节存储
  • mediumint:中整型,使用3个字节存储
  • int/integer:标准整型,使用4个字节存储:常用
  • bigint:大整型,使用8个字节存储
    在这里插入图片描述
  • 插入数据:只能插入整型,只能插入范围内的整型:其实使用字符串的数字形式也是可以的:‘5’
    在这里插入图片描述
  • 如果插入的数据是小数或字符串形式的小数,那么系统会先进行四舍五入转换为整型后在存储数据表中
    在这里插入图片描述
  • 插入数据超过了范围:严格模式与非严格模式:严格模式会报错;非严格模式不会报错,但数据会不正确
    在这里插入图片描述
  • 查看表结果发现,每个字段的数据类型后面都会自带一个小括号,里面指定数字
    在这里插入图片描述
  • 显示宽度:没有特别的含义,只是默认的告诉用户可以显示的形式而已:实际上用户可以控制的,这种控制不会改变数据本身的大小
    在这里插入图片描述
  • 显示宽度的意义:在于当数据不够显示宽度的时候,会自动让数据变成对应的数显宽度:通常需要搭配一个前导0来增加宽度,不改变值大小:zerofill(零填充):零填充会导致数据类型自动变为无符号:因为如果在负数前面添加前导0,系统会认为是一个算术运算,而不是一个值:例如0-123
    在这里插入图片描述
  • 零填充的意义:保证数据的格式

小数类型

  • 带有小数点或范围超出了整型的数值类型
  • SQL中将小数类型分成2类:浮点型与定点型
  • 浮点型:小数点浮动, 精度有限,而且会丢失精度
  • 定点型:小数点固定, 精度固定, 不会丢失精度

浮点型

  • 浮点型数据是一种精度型数据: 因为超出指定范围之后, 会丢失精度(自动四舍五入)
  • 浮点型: 理论分为两种精度(计算机使用了有限的空间进行存储—导致了精度问题)
    (1)float:单精度, 占用4个字节存储数据, 精度范围大概为7位左右
    (2)double:双精度,占用8个字节存储数据, 精度方位大概为15位左右
float精度
1. 数学领域中的精度一般指有效数字,是十进制位数,而计算机中的精度通常是指 二进制位数。
2. 一个前提:进制转换不会导致精度变化
3. 浮点数的精度决定于尾数部分,而尾数占了23个二进制位,2^23转化为十进制数为 8388608个十进制位,因此有一种说法是float的十进制精度为 7 位,但是由于其并不能表示所有7位十进制数(0000000~9999999),因此也有种说法是其精度为7位。
4. 尾数表示范围:2^23 = 8388608
  • 创建浮点数表:直接使用float表示没有小数部分;float(M,D)其中M表示数据总长度,D表示小数部分长度,那么M-D就是整数部分的长度
    在这里插入图片描述
    在这里插入图片描述
  • 插入数据: 可以是直接小数,也可以是科学计数法,也可以是字符串形式的数据
    在这里插入图片描述
  • 浮点型数据的插入: 整型部分是不能超出长度的,但是小数部分可以超出长度(系统会自动四舍五入)
  • 结果: 浮点数一定会进行四舍五入(超出精度范围): 浮点数如果是因为系统进位导致整数部分超出指定的长度,那么系统也允许成立.

定点型

  • 定点型: 绝对的保证整数部分不会被四舍五入(不会丢失精度),小数部分有可能(理论小数部分也不会丢失精度)
  • 变长:大致每9个数字采用4字节存储:整数部分和小数部分分开计算
    在这里插入图片描述
  • 插入数据: 定点数的整数部分一定不能超出长度(进位不可以),小数部分的长度可以随意超出(系统自动四舍五入)

字符串类型

  • 在SQL中字符串类型被细分为6类:char、varchar、text、blob、enum、set

定长字符串char

  • 定长字符串:char,磁盘(二维表)在定义结构的时候,就已经确定了最终数据的存储长度
  • char(L):L代表length,可以存储的长度,单位是字符,注意不是字节;最大长度可以存储255个字符
  • char(4):表示最多可以存储4个字符:在UTF-8环境下,需要4*3 = 12个字节

变长字符串varchar

  • 变长字符串:varchar,在分配存储空间的时候按照最大的空间分配:但是实际存储数据的时候最终用了多少是根据具体的数据来确定的
  • varchar(L):L表示长度,单位是字符:理论上长度是65536个字符,但是会拿1到2个字节来确定存储的字符的实际长度:如果存储的字符没有超过255个,那么就拿1个字节记录字符的实际个数;如果存储的字符个数超过了255个,那么就需要拿2个字节来记录字符的实际个数:但是实际上如果字符长度超过了255个即不使用定长也不使用变长,而是使用文本字符串text
  • varchar(10):的确存储了10个汉字,在UTF8环境下需要10 * 3 + 1 = 31 bytes;如果存储了3个汉字,那么需要3 * 3 + 1 = 10 bytes
  • 定长字符串与变长字符串实际存储空间对比
实际存储的数据char(4)varchar(4)char占用字节varchar占用字节
ABCDABCDABCD4 * 3 = 124 * 3 + 1 = 13
AAA4 * 3 = 121* 3 + 1 = 4
ABCD E××数据超过长度数据超过长度
  • 如何选择定长字符串或者是变长字符串呢?
    (1) 定长的磁盘空间比较浪费,但是效率高:如果数据基本上确定长度都是一样的,那么就是使用定长:如身份证、电话号码、手机号码等
    (2) 变长的磁盘空间比较节约,但是效率低:如果数据不能确定长度,即不同数据长度有变化,如姓名、地址等

文本字符串text/blob

  • 如果数据量非常大,通常说超过255个字符就会使用文本字符串
  • 文本字符串根据存储的数据格式进行分类:text与blob
  • text:存储文字
  • blob:存储二进制数据,但是通常不用:二进制数据实际上存储的都是路径
  • tinytext、text、mediumtext、longtext:但是存储数据时通常不指定长度,可以自己计算

枚举字符串enum

  • 枚举:enum,事先将所有可能出现的结果都设计好,实际上存储的数据必须是规定好的数据中的一个
  • 枚举的使用方式:
  • 定义:enum(可能出现的元素列表);
  • 使用:存储数据,只能存储上面定义好的数据
  • 创建枚举表
    在这里插入图片描述
  • 新增数据:使用枚举类型的作用:
    (1) 规范数据格式:数据只能是规定的数据中的其中一个
    (2) 节省存储空间,系统使用1或2个字节存储枚举数据:枚举通常有一个别名:单选框:枚举实际存储的是数值而不是字符串本身:在mysql系统中,系统自动转换数据格式
    在这里插入图片描述
  • 证明枚举类型的字段存储的数据是数值:将数据取出来+0就可以判断出原来的数据存储的到底是字符串还是数值:如果是字符串最终结果永远为0,否则就是整数值
    在这里插入图片描述
  • 枚举元素的实际规律:按照元素出现的顺序:从1开始编号
  • 枚举原理:枚举在进行数据规范的时候,即数据定义的时候,系统会自动建立一个数字与枚举元素的对应关系,此关系放到日志文件中:然后再进行数据插入的时候,系统自动将字符转换成对应的数字存储,然后在进行数据提取的时候,系统自动将数值转换成对应的字符串显示
  • 因为枚举实际存储的是数值,所以可以直接插入数值:次数值必须是在枚举常量中的一个

集合字符串set

  • 集合字符串跟枚举字符串很类似:实际存储的是数值,而不是字符串:但集合是多选框
  • 集合的使用方式
  • 集合的定义:set(元素列表)
  • 集合的使用:可以使用元素列表中的元素,可以使用多个元素,使用逗号分隔
  • 系统使用1、2、3、4、8个字节存储集合的数据
  • 创建集合表
    在这里插入图片描述
  • 将字段hpbby修改为hoppy
alter table my_set change hpbby bobby set('篮球', '足球', '乒乓球', '羽毛球', '排球', '台球', '网球',  '棒球');
  • 插入数据:可以使用多个元素字符串组合:字符串之间使用逗号分隔,逗号之后不能再有空格;也可以直接插入数值
    在这里插入图片描述
  • 集合中每一个元素对应一个二进制位
    在这里插入图片描述
  • 插入数据的时候,values中的集合的顺序是没有要求的,系统最终都会去匹配顺序
  • 集合的强大之处在于规范数据与节省磁盘空间

时间日期类型

  • datatime:时间日期类型,格式为:YYYY-mm-dd HH:ii:ss:表示的范围是从1000到9999年,有0值:0000-00-00 00:00:00:8个字节存储
  • date:datetime中的date部分,使用3个字节存储
  • time:表示时间或时间段,使用3个字节存储
  • timestamp:时间戳,但并不是时间戳,只是从1970年开始的YYYY-mm-dd HH:ii:ss,格式与datetime完全一致:使用4个字节存储
  • year: 年份,两种形式, year(2)和year(4): 1901-2156,使用1个字节存储
    在这里插入图片描述
  • 插入数据:时间time可以是负数,而且可以是很大的负数;year可以使用2位数插入,也可以使用4位数
-- 插入数据: 时间日期格式的数据采用字符串形式
insert into my_datetime values('2020-6-30 8:08:12', '2020-6-30', '8:08:12', '2020-6-30 8:08:12', 2020);
insert into my_datetime values('2020-6-30 8:08:12', '2020-6-30', '8:08:12', '2020-6-30 8:08:12', '2020');

在这里插入图片描述

  • 时间可以是负数:表示过去的多长时间
    在这里插入图片描述
  • year(2)的用法:year不能使用负数
    在这里插入图片描述
  • timestamp字段:只要当前所在记录被更新(任何字段被更新都行),该字段一定会更新为当前时间
    在这里插入图片描述

MySQL记录的长度

  • MySQL中规定:任何一条记录最长不能超过65535个字节:所以varchar永远达不到理论值:varchar理论上可以存储65535个字符
  • varchar的实际存储长度最大能达到多少?看字符集编码
  • UTF8下varchar的实际顶配:21844 个字符
create table my_utf8(
	name varchar(21845)
)charset utf8; -- utf8字符集编码

在这里插入图片描述

create table my_utf8(
	name varchar(21844)  -- 分配21844 * 3 + 2 = 63332 + 2 = 65534 < 65535
)charset utf8; -- utf8字符集编码

在这里插入图片描述

  • 字符长度最大为21844个字符,那么在utf8编码字符集下:系统需要给该字段分配的字节数 = 21844 * 3 + 2(记录字符实际的个数) = 63332 + 2 = 65534 bytes:记录中只有一个name varchar(21844)的字段,所有该记录的大小没有超过mysql系统规定的一条记录的最大字节数
  • GBK下varchar的实际顶配:32766个字符
    在这里插入图片描述
create table my_gbk(
	name varchar(32766) -- 系统需要分配32766*2+2=65532+2 = 65534 bytes
)charset gbk; -- gbk字符集

在这里插入图片描述

  • 无论是使用UTF8字符集还是使用GBK字符集,每条记录都不能完全使用完65535个字节的空间,若想每条记录用光65535个字节,可以增加一个tinyint类型的字段
    在这里插入图片描述
  • 创建失败:MySQL记录中:如果有任何一个字段允许为空,那么系统会自动从整个记录中保留一个字节来存储NULL:若想释放NULL所占用的字节空间:就必须保证所有字段都不允许为空
    在这里插入图片描述
  • MySQL中文本字符串text不占用记录长度:额外存储但是text文本字符串也是属于记录的一部分:一定需要占据记录中的部分长度:10个字节:保存数据的地址以及长度
    在这里插入图片描述
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值