【MySQL系列】深入学习数据类型

这篇具有很好参考价值的文章主要介绍了【MySQL系列】深入学习数据类型。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

「前言」文章内容大致是数据库的数据类型。

「归属专栏」MySQL

「主页链接」个人主页

「笔者」枫叶先生(fy)

【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

一、数据类型分类

C/C++语言有自己的数据类型,MySQL也有自己的数据类型,常见的的数据类型如下:
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
注:带红色的是下面要讲解的类型

数据类型的作用:

  • 决定了存储数据时应该开辟的空间大小。
  • 决定了数据的取值范围。

二、数值类型

2.1 tinyint类型

接下来讲解数值类型的整型,整型的取值范围跟C/C++语言的数据类型取值范围都差不多,同样有有符号和无符号的区别
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

整型以tinyint为例

创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
圆括号4,下一个篇章约束再谈,这里暂时不理会
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
tinyint类型占用1字节,有符号tinyint的取值范围为-128~127,进行插入数据
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
如果插入的数据不在-128~127范围,则不允许插入,报错:
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

下面是无符号tinyint范围测试

创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
tinyint类型占用1字节,无符号tinyint的取值范围为0~255,进行插入数据:
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
如果插入的数据不在0~255范围,则不允许插入,报错:
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
注意:向MySQL插入不合法的数据,MySQL会直接拦截我们的操作;如果我们已经将数据成功插入表中,那么插入的数据一定合法的。所以在MySQL中,数据类型本身就是一种约束。

从上面的例子也可以看出,MySQL表中建立属性列是列名字在前,类型在后

num(列名) tinyint(类型)

注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不
下,与其如此,还不如设计时,将int类型提升为bigint类型

以上便是tinyint的介绍,其他整型也类似,不再演示

2.2 bit类型

基本语法:

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

注:[] 的部分可以省略

创建一个表,表当中包含一个int类型和一个bit类型,bit默认为1位
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
向表中插入数据,一个bit位只允许插入0,1
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
查看表的数据,发现bit类型不显示,根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,有些字符是不可显示的
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
如果要查看该值,强转为十进制
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
修改表,改成 bit(10)
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
再次插入数据,结果证明确实是按ASCII码对应的值进行存储
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
bit(M),M最大值是64,如果超过了创建表就会失败
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
如果我们有这样的需求,只存放0或1,这时可以定义bit(1),这样可以节省空间

2.3 小数类型

2.3.1 float类型

语法:

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

创建一个表,包含一个float(4,2)类型的列,默认其为有符号类型
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
float(4,2)表示的范围是-99.99 ~ 99.99,在该范围内可以插入数据,超过范围报错
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
尝试插入超过范围的
说明:MySQL在保存值时会进行四舍五入
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
即使输入多位小数,也会按指定的格式显示
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
注意:无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分砍掉了,因此float(4,2)的取值范围为0~99.99

还有一个问题要注意,float类型会精度丢失问题
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

2.3.2 decimal类型

语法:

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
  • 这点与float是一样的

decimal和float很像,但是有区别:float和decimal表示的精度不一样

测试精度

创建一个表,表当中分别包含一个float(10,8)的列和一个decimal(10,8)的列
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
向表当中插入数据,查表结果float则会存在一定的精度损失,decimal则没有
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

  • float表示的精度大约是7位
  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略, 默认是10(可能会受到MySQL版本影响)

decimal的精度更准确,因此如果我们希望某个数据表示高精度,可以选择decimal

2.4 字符串类型

2.4.1 char类型

语法:

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

测试:

创建一个表,表当中包含一个char(2)列
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
插入数据,需要注意的是,在MySQL里,这里所说的字符并不与C/C++里面的字符相同,在MySQL里一个汉字也是一个字符

在不同编码中,一个字符所占的字节个数是不同的,比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

2.4.2 varchar类型

语法:

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

测试:

创建一个表,表当中包含一个varchar(2)
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
插入数据,varchar在这与char没什么区别
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

varchar类型注意事项

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

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

【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

2.4.3 char和varchar比较

char和varchar比较

  • char类型可存储字符上限为255,varchar类型可存储字符上限与表的编码格式有关。
  • char(L)定义后,无论存储的字符串长度是否到达L,都会开辟用于存储L个字符的定长空间,如果存储的字符串长度超过L则会报错。
  • varchar(L)定义后,会根据存储字符串的长度按需开辟空间,并且需要使用1-3字节的空间用于表示存储字符串的长度以及其他控制信息,如果存储的字符串长度超过L则会报错。

以utf8编码为例:
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

如何选择定长(char)或变长字符串(varchar)?

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

2.5 时间日期类型

常用的日期有如下三个:

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

创建一个表,表当中包含date、datetime和timestamp三种时间日期类型的列

查看表结构可以看到,timestamp类型的t3列是不允许为空的,它的默认值为CURRENT_TIMESTAMP

如果向表中插入数据,t3会自动更新到最新时间(无需手动插入)
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
向表中插入值
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
更新数据,时间戳会更新
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

2.6 enum和set

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

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

set:集合,“多选”类型:

set('选项值1','选项值2','选项值3', ...);
  • 该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储了其中任意多个值(可以选取其中的一个或多个值)
  • 出于效率考虑,这些值实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32,....,最多64个

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

例子

创建一个调查表,表当中包含被调查人的姓名、性别(只选一个)和爱好(多个)
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

可以通过数字设置enum

数字是从1开始,有几个值数字最大就是几,例如enum(‘男’, ‘女’),数字1代表男,数字2代表女,最大就是2,超过了范围则不允许插入
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
根本原因在于,MySQL出于效率考虑,这些值(比如男,女)实际存储的是“数字”,因为这些选项的每个选项值依次对应如下数字:1,2,3,....,最多65535

可以通过数字设置set

在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置
使用数字插入并不是使用下标,使用的是位图的方式进行插入
例如:

'羽毛球','游泳','篮球','写代码' // 4个爱好
用比特位表示:0000
0001 (1)是羽毛球
0010 (2)是游泳
0011 (3)是羽毛球,游泳
0100 (4)是篮球
依次类推
1111 (15)则是'羽毛球','游泳','篮球','写代码'

【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
:虽然enum和set可以通过数字的方式进行设置,但严重不推荐这种做法,因为这样的SQL可读性太差

enum和set查找

如果想要筛选出调查表中的所有女的或男的,那么直接在筛选时指明gender='女'或者gender='男'即可
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
但如果要筛选出调查表中爱好包含游泳的就不能使用where了,这并不是我们想要的结果
【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android

集合查询使用find_ in_ set函数:

  • find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0;
  • str_list字符串是用逗号分隔的字符串

【MySQL系列】深入学习数据类型,MySQL,mysql,学习,android
--------------------- END ----------------------文章来源地址https://www.toymoban.com/news/detail-573147.html

「 作者 」 枫叶先生
「 更新 」 2023.7.17
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
          或有谬误或不准确之处,敬请读者批评指正。

到了这里,关于【MySQL系列】深入学习数据类型的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入学习MYSQL-数据检索

    前言 由于大部分基础知识都已经学过了,这里只把觉得应该记录一下的知识点做个笔记。然后以下笔记和sql均来自书籍(MYSQL必会知识),会根据看的其它书记继续调整和优化笔记。 LIMIT 注:这个平时的SQL查询没有什么区别,我主要展示一下在命令行里面怎么展示结果。 总共8条

    2024年02月05日
    浏览(35)
  • MySQL学习【数据类型】【权限查询表】

    整型 类型名称 取值范围 大小 TINYINT -128〜127 1个字节 SMALLINT -32768〜32767 2个宇节 MEDIUMINT -8388608〜8388607 3个字节 INT (INTEGHR) -2147483648〜2147483647 4个字节 BIGINT -9223372036854775808〜9223372036854775807 8个字节 无符号在数据类型后加 unsigned 。 浮点型 类型名称 说明 存储需求 FLOAT 单精

    2024年02月10日
    浏览(46)
  • 【MySQL系列】数据库基础学习_简单认识数据库

    「前言」文章内容大致是数据库基础,以及数据库的基本知识。 「归属专栏」MySQL 「主页链接」个人主页 「笔者」枫叶先生(fy) 「枫叶先生有点文青病」「句子分享」 我见青山多妩媚,料青山、见我应如是。 ——辛弃疾《贺新郎》 MySQL实际上是一个网络服务(client/server模式

    2024年02月15日
    浏览(43)
  • 轻松入门MySQL:深入学习数据库表管理,创建、修改、约束、建议与性能优化(3)

    在项目中,正确设置数据表的限定条件是数据存储过程中的关键一步。我们频繁需要创建和修改表以管理各种业务数据。让我们深入学习创建和修改数据表的方法,以产品信息表( product_info )为例。 创建数据表 首先,让我们了解产品信息表的结构: product_id product_name cate

    2024年02月20日
    浏览(56)
  • 解决Data too long for column ‘xxx‘ at row 1问题以及深入理解mysql的字符串数据类型(char,varchar,enum,text,longtext...)

    今天在测试环境新增数据时,报出如是错误: Data too long for column \\\'apply_service_type\\\' at row 1 。 为了复现这个问题,我特地在本地数据库中增加如下 test 表:

    2023年04月17日
    浏览(47)
  • Flink系列之:Flink CDC深入了解MySQL CDC连接器

    增量快照读取是一种读取表快照的新机制。与旧的快照机制相比,增量快照具有许多优点,包括: (1)在快照读取期间,Source 支持并发读取 (2)在快照读取期间,Source 支持进行 chunk 粒度的 checkpoint (3)在快照读取之前,Source 不需要数据库锁权限。 如果希望 source 并行运

    2024年02月02日
    浏览(46)
  • 【MySQL】MySQL数据类型

    注: mysql不区分大小写 当定义数据类型后 ,插入的 数据需要遵循数据类型的约束。 创建一个有符号的数据类型 : 创建一个无符号的数据类型: 在添加数据时,如果超出数据类型所允许的范围,mysql服务会拦截命令语句。 bit 类型 bit[(M)] : 位字段类型。M表示每个值的位数,

    2024年02月04日
    浏览(41)
  • 【MySQL】MySQL 数据类型

    目录 1. tinyint 类型 2. bit 类型 3. 小数类型 1、float 类型 2、decimal 类型 3. 字符串类型 1、char 类型  2、varchar 类型 4. 日期类型 5. enum和set 1、枚举和集合类型语法 2、枚举和集合类型的查找 6、find_in_set 函数 写在最后: 我们以 tinyint 类型为例子,介绍 int 系列的类型。 1)我们先

    2024年02月13日
    浏览(35)
  • MySQL数据库的数据类型和基于MySQL数据类型的综合实例项目

    数值型数据类型主要用来存储数字。MySQL的整数类型如下所示 TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、 BIGINT。 类型名称 说明 存储需求 TINYINT 很小的整数 1字节 SMALLINT 小的整数 2字节 MEDIUMINT 中等大小的整数 3字节 INT 普通大小的整数 4字节 BIGINT 大整数 8字节 创建表tmp1,其中字段

    2023年04月08日
    浏览(46)
  • MySql004——MySQL 数据类型

    和Java中的数据类型一样,MySQL中的字段也有数据类型一说 👉👉👉👉👉最后,有兴趣的小伙伴可以点击下面链接,这里有我整理的MySQL学习博客内容,谢谢~ 🌹🌹🌹🌹🌹 《MySQL数据库学习》

    2024年02月14日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包