当前位置: 首页 > news >正文

【MySQL】从零开始了解数据库开发 --- 数据类型

在这里插入图片描述

我不假思索地上路,
因为出发的感觉太好了,
世界突然充满了可能性。
--- 杰克·凯鲁亚克 ---

从零开始了解数据库开发

  • MySQL中的数据类型
  • 数字类型
  • 字符串类型
  • 日期类型

MySQL中的数据类型

MySQL数据库汇中,每一条数据都有其类型,主要分为三类:数字类型,字符串类型,日期时间类型。下面我们依次来介绍

数字类型

类型分类数据类型描述
数字类型INT整数类型,用于存储整数。 有符号 -231 ~ 231-1
数字类型TINYINT小整数类型,用于存储非常小的整数。有符号 -128 ~ 127
数字类型SMALLINT小整数类型,用于存储较小的整数。 有符号 -215 ~ 215-1
数字类型MEDIUMINT中等大小整数类型,用于存储中等大小的整数。
数字类型BIGINT大整数类型,用于存储大整数。 有符号 -263 ~ 263-1
数字类型FLOAT[(M , D)]单精度浮点数类型,用于存储单精度浮点数。 M指定长度,D指定小数位数
数字类型DOUBLE [(M , D)]双精度浮点数类型,用于存储双精度浮点数。
数字类型DECIMAL [(M , D)]定点数类型,用于存储精确的小数。
数字类型BIT(M)位类型。M指定位数,默认值1 ,范围1-64

数字类型分为了整型,浮点型,位类型。创建表时可以选择合适的数据类型进行储存

我们先来看整型:我们创建这样一个表在这里插入图片描述
我们插入一下age这个数据:在这里插入图片描述
可以看到对于tinyint类型,超出其范围的数据是不能被插入到数据表中的。如果是unsigned tinyint类型呢
在这里插入图片描述
对于无符号的,返回就是0~255,超出范围的数据就不能被储存。对于其他整型类型也是一样的。
在这里插入图片描述
这个对于非法数据插入时的保持拦截是mysql的一个重要特性,在c/c++中,出现这种超出范围的存储char c = 123546,编译器不一定会报错,可能会优化进行截断,c储存的值就不是我们赋予的值。如果数据库也这么处理,那么数据库中的数据将变得不可信!所以这种拦截可以保证插入到数据库中的数据一定是合法的!所以:数据类型本身也是一种约束

注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型 但是也一定要注意使用合适的类型,对于数据库庞大的数据,每一个都浪费一点,那么会造成很大的资源浪费!

再来看字节类型BIT(M),我们创建一个表:在这里插入图片描述
在这里插入图片描述
可以看到超出1位的数值不能被插入。

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

创建一张这个表
在这里插入图片描述
我们插入几行数据在这里插入图片描述
通过这个插入可以发现,对于整数部分超出M-d位的是不能被存储的,如果小数部分超出,则会进行四舍五入保值。注意四舍五入后如果超出范围,也会被拦截。对于浮点型的无符号类型,是对储存类型直接去掉负数,储存的上限不会变。

当把数据类型改为float时,如果数值超出其储存范围,会出现损失精度的现象:
在这里插入图片描述
对于float无法储存的数据,这里建议使用decimal。
在这里插入图片描述
我们建立一个这样的表,插入同样的数据:

在这里插入图片描述
decimal的精度显然更高!

decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
建议:如果希望小数的精度高,推荐使用decimal。

字符串类型

类型分类数据类型描述
字符串类型VARCHAR变长字符串类型,用于存储可变长度的字符串。 最多只能是65535
字符串类型CHAR定长字符串类型,用于存储固定长度的字符串。 最多只能是255
字符串类型TEXT文本类型,用于存储长文本。
字符串类型TINYTEXT微型文本类型,用于存储非常短的文本。
字符串类型MEDIUMTEXT中等长度文本类型,用于存储中等长度的文本。
字符串类型LONGTEXT长文本类型,用于存储非常长的文本。
字符串类型BLOB二进制大对象类型,用于存储二进制数据。
字符串类型TINYBLOB微型二进制大对象类型,用于存储非常小的二进制数据。
字符串类型MEDIUMBLOB中等长度二进制大对象类型,用于存储中等长度的二进制数据。
字符串类型LONGBLOB长二进制大对象类型,用于存储非常长的二进制数据。
字符串类型ENUM枚举类型,用于存储枚举值,即一组预定义的字符串。
字符串类型SET集合类型,用于存储一组预定义的字符串,可以包含多个值。

字符串类型最典型的就是 char与varchar。我们先来看char,这是一个固定长度的字符串,我们的插入必须是小于等于其长度。
在这里插入图片描述
这里发现汉字和英语字母都是最大插入三个,但是utf8编码中汉字是占3个字节,所以:mysql中的字符与c/c++中不同 ,字符可以是字母或汉字。c/C++中字符就是一个字节,mysql不是!

再来看varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节。
在这里插入图片描述
这里性质与char一致,大于其长度的无法插入。
再来看这样一个现象,当我们想要修改varchar的储存长度为65535时,会出现一个报错:
在这里插入图片描述
提升我们不能扩展到65535,而只能到16383。这里是因为根据字符集的规定,中文字符可能会使用不同的字节数:

  • 如果你使用的是utf8mb4字符集(MySQL推荐使用的完整UTF-8编码),每个中文字符确实占用4个字节
  • 如果是utf8字符集,每个中文字符占用3个字节
  • 如果是latin1字符集,每个中文字符可能无法正常存储

所以对于utf8mb4字符集字符集65535个字节最多只能储存16383个中文字符!

varchar(len)与编码密切相关!varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532

在这里插入图片描述
如果储存的长度过长,建议使用大文本储存。

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

  1. 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
  2. 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
  3. 定长的磁盘空间比较浪费,但是效率高。
  4. 变长的磁盘空间比较节省,但是效率低。
  5. 定长的意义是,直接开辟好对应的空间
  6. 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少
  7. 两者的关系与 c/c++中的 char[ ] 与 string 很相似

日期类型

类型分类数据类型描述
日期类型DATE日期类型,用于存储日期值(年-月-日)。
日期类型TIME时间类型,用于存储时间值(时:分:秒)。
日期类型DATETIME日期时间类型,用于存储日期和时间值(年-月-日 时:分:秒)。
日期类型TIMESTAMP时间戳类型,用于存储时间戳值,表示自1970-01-01 00:00:00 UTC以来的秒数。

常用的日期有如下三个:

  1. date :日期 ‘yyyy-mm-dd’ ,占用三字节。记录需要储存的时间日期
  2. datetime :时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节。记录需要储存的时间日期
  3. timestamp :时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节。一个表中可以有多个TIMESTAMP字段,但只有一个可以设置为DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。这个是记录数据的创建/修改时间。

在这里插入图片描述


文章转载自:

http://tj9mQDfX.jfymz.cn
http://EbiO5ROW.jfymz.cn
http://KFrHKMp8.jfymz.cn
http://EXDxQszb.jfymz.cn
http://UgxeJ7H1.jfymz.cn
http://t4hKooMc.jfymz.cn
http://HSaEB4wG.jfymz.cn
http://2iYTWpkq.jfymz.cn
http://0N1bCqHy.jfymz.cn
http://i4p7Jaqc.jfymz.cn
http://0wzN9PzL.jfymz.cn
http://UxUQ5XEZ.jfymz.cn
http://fPl0qwaS.jfymz.cn
http://r6V4iotc.jfymz.cn
http://b6ZegNHh.jfymz.cn
http://qIl8FNq1.jfymz.cn
http://NgISUNEe.jfymz.cn
http://Q44Z5R4O.jfymz.cn
http://QlOUV1bd.jfymz.cn
http://h39K5Wn5.jfymz.cn
http://VAQ1CR3Y.jfymz.cn
http://JvzL3Rl3.jfymz.cn
http://sN5p2hLP.jfymz.cn
http://W4nd1NDE.jfymz.cn
http://L9F4r2Om.jfymz.cn
http://gtE5Bvee.jfymz.cn
http://B4SBt2Qd.jfymz.cn
http://euNzXnvZ.jfymz.cn
http://3mQox1Zn.jfymz.cn
http://W6B4O0KY.jfymz.cn
http://www.dtcms.com/a/374973.html

相关文章:

  • ElasticSearch复习指南:从零搭建一个商品搜索案例
  • 宋红康 JVM 笔记 Day15|垃圾回收相关算法
  • 【01】完整的安卓二次商业实战-详细的初级步骤同步项目和gradle配置以及开发思路-优雅草伊凡
  • 【python实用小脚本-211】[硬件互联] 桌面壁纸×Python梦幻联动|用10行代码实现“开机盲盒”自动化改造实录(建议收藏)
  • 前端安全攻防:XSS, CSRF 等常见威胁的防范与检测指南
  • 算法题(203):矩阵最小路径和
  • 强化学习在复杂调度问题中的常见陷阱与改进思路
  • AI基础设施——NVIDIA GB300 NVL72
  • 实战项目-----在图片 hua.png 中,用红色画出花的外部轮廓,用绿色画出其简化轮廓(ε=周长×0.005),并在同一窗口显示
  • 第一章 神经网络的复习
  • Spring Cloud 配置中心
  • Typescript入门-d.ts类型声明文件讲解
  • DBF Viewer 2000:专业的DBF文件查看与编辑工具
  • 【字符压缩存在整数32bit技术】
  • 【芯片设计-信号完整性 SI 学习 1.0 -- SI 介绍】
  • uniapp开源多商户小程序商城平台源码 支持二次开发+永久免费升级
  • map / unordered_map / set / unordered_set
  • 不同数据仓库模型有什么不同?企业如何选择适合的数据仓库模型?
  • jmeter入门
  • 【ShiMetaPi】基于BM1684X的智能工业视觉边缘计算盒子解决方案
  • [论文阅读] 算法 | 抗量子+紧凑!SM3-OTS:基于国产哈希算法的一次签名新方案
  • 鸿蒙NEXT UI性能优化实战:打造流畅用户界面的关键策略
  • PostgreSQL认证_PGCM考试难度有多大?
  • Spring Security的理解与使用
  • 论文阅读_大模型情绪分析预测股票趋势
  • 学习嵌入式的第三十六天——数据库与网页制作
  • 【C++】list 容器操作
  • 【WRF-VPRM 预处理器第二期】VPRMpreproc.r 脚本详解
  • 430章:Python Web爬虫入门:使用Requests和BeautifulSoup
  • 在 Vite 中,环境变量的处理方式与传统的 Node.js 环境有所不同