MySQL数据类型

目录

MySQL数据类型

数据类型分类

数值类型

tinyint类型

bit类型

float类型

decimal类型

字符串类型

char类型

varchar类型

char和varchar比较

时间日期类型

enum和set类型


MySQL数据类型

数据类型的作用:

  • 决定了存储数据时应该开辟的空间大小。
  • 决定了如何识别一个特定的二进制序列。
  • 决定了数据的取值范围。

数据类型分类

说明一下:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。

数值类型

tinyint类型

有符号tinyint范围测试

创建一个表,表当中包含一个tinyint类型的列,默认其为有符号类型。如下:

由于tinyint类型占用1字节,因此有符号tinyint的取值范围为-128~127,插入该范围内的数据时都能成功插入。如下:

如果插入的数据不在-128~127范围内,那么插入数据时就会产生报错。如下:

无符号tinyint范围测试

创建一个表,表当中包含一个tinyint类型的列,并指定其为无符号类型。如下:

由于tinyint类型占用1字节,因此无符号tinyint的取值范围为0~255,插入该范围的数据时都能成功插入。如下:

如果插入的数据不在0~255范围内,那么插入数据时就会产生报错。如下:

建议:

  • 除非场景要求数值类型必须是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型同样可能存不下,这时应该直接将数值类型进行提升。

bit类型

bit类型的显示方式

创建一个表,表当中包含一个int类型的id列和一个8位bit类型的a列。如下:

 向表中插入一条记录,记录中指定id和a的值均为10,插入记录后查看表会发现a的值显示的并不是10。如下:

根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,而在ASCII码表中10对应的是控制字符LF,表示换行的意思。如果向表中插入记录时指定id和a的值均为65,由于ASCII码表中65对应的是字符A,因此插入记录后查看表就会发现a的值显示的是A。如下:

bit类型的范围测试

创建一个表,表当中包含用户名name和用户性别gender,其中gender的类型可以指定为1位bit类型,因为性别只有男和女两种取值,使用1个比特位来表示用户的性别就可以节省空间。如下:

如果规定gender列插入0表示男,插入1表示女,那么在插入用户信息时就可以通过插入0和1来指定用户的性别。如下:

如果插入gender列的数据不是0或1,那么插入数据时就会产生报错。如下:

建议:

  • 虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。
  • 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。

float类型

有符号float范围测试

创建一个表,表当中包含一个float(4,2)类型的列,默认其为有符号类型。如下:

由于float(4,2)的取值范围为-99.99~99.99,因此插入该范围内的数据都能成功插入。如下:

此外,由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,如果插入的数据不在该范围内,那么插入数据时就会产生报错。

无符号float范围测试

创建一个表,表当中包含一个float(4,2)类型的列,并指定其为无符号类型。如下:

无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994。

如果插入的数据不在0~99.994范围内,那么插入数据时就会产生报错。如下:

decimal类型

decimal的精度更高

decimal和float类型的使用方式一样,但decimal的精度比float更高。

创建一个表,表当中分别包含一个float(10,8)的列和一个decimal(10,8)的列。如下:

向表当中插入一条记录,指定float和decimal的值均为23.12345612,但最终查表时会发现decimal保持了数据的原貌,而float则会存在一定的精度损失。如下:

字符串类型

char类型

char类型测试

创建一个表,表当中包含一个char(6)的content列。

由于char(6)中最多可存储6个字符,因此只要插入的字符个数不超过6个都是能够成功插入的。

如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。如下:

需要注意的是,这里所说的字符并不只是指一个英文字母,一个汉字也是一个字符,因此只要插入的汉字个数不超过6个也是可以插入的。

好处:

  • 在不同编码中,一个字符所占的字节个数是不同的,比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。MySQL限定字符的概念不是字节,这样用户就不用关心复杂的编码细节了。

varchar类型

varchar类型测试

创建一个表,表当中包含一个varchar(6)的content列。

由于varchar(6)中最多可存储6个字符,因此只要插入的字符个数不超过6都是能够成功插入的。

如果插入的字符个数超过了6个,那么在插入数据时就会产生报错。

varchar类型可指定的字符个数上限

varchar类型最多占用65535字节,其中有1~2字节用来表示实际数据长度,还有1字节来存储其他控制信息,因此varchar类型的有效字节数最多是65532字节。

而varchar类型可指定的字符个数上限,与表的编码格式有关:

  • 对于utf8编码来说,一个字符占用三个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 3 = 21844。
  • 对于gbk编码来说,一个字符占用两个字节,因此varchar(L)中的L最大可指定为 65532 ÷ 2 = 32766 .

因此在定义编码格式为utf8的表时,varchar(L)中的L如果超过了21844,则会产生报错。

而在定义编码格式为gbk的表时,varchar(L)中的L如果超过了32766,则会产生报错。

char和varchar比较

char和varchar比较

char和varchar的区别如下:

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

如何选取char和varchar类型?

char和varchar的优缺点如下:

  • char类型的数据是定长的,因此磁盘空间比较浪费,但是效率高(直接访问定长的空间)。
  • varchar类型的数据是变长的,因此磁盘空间比较节省,但是效率低(需要先读取存储字符串的长度,再访问指定长度的空间)。

如果要存储的数据是定长的,那就使用char类型进行存储,比如身份证号码、手机号、md5等。如果要存储的数据是变长的,那就使用varchar类型进行存储,比如名字、地址等。

时间日期类型

三种时间日期类型

常用的三种时间日期类型如下:

  • date:日期格式为YYYY-MM-DD,占用三字节。
  • datetime:时间日期格式为YYYY-MM-DD HH:MM:SS,占用八字节。
  • timestamp:时间戳,格式为YYYY-MM-DD HH:MM:SS,占用四字节。

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

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

因此如果插入数据时不插入t3列,那么就会自动插入当前的时间戳。如下:

timestamp类型使用案例

创建一个评论表,表当中包含评论人的昵称、评论的内容和评论的发布时间。如下:

向评论表中插入记录时,只需要指明评论人的昵称和评论的内容,评论的发布时间默认会设置成该记录的插入时间。如下:

如果评论人修改了评论内容,那么就需要对评论表进行更新,更新表的同时评论的发布时间也会更新为修改表的时间。如下:

enum和set类型

enum和set类型

enum和set类型的区别如下:

  • 在定义enum字段时需要提供若干个选项的值,在设置enum字段值时只允许选取其中的一个值。
  • 在定义set字段时需要提供若干个选项的值,在设置set字段值时可以选取其中的一个或多个值。

比如人的性别只能从男和女中进行二选一,因此可以定义成enum类型,而人的爱好在提供的选项中可能存在多个,因此可以定义成set类型。

调查表案例

创建一个调查表,表当中包含被调查人的姓名、性别和爱好。如下:

向表中插入记录时,被调查人的性别只能从男和女中进行二选一,被调查人的爱好可以从提供的若干个选项中进行多选一或多选多,多个爱好之间需要通过英文逗号隔开。如下:

通过数字设置enum

在插入记录时,除了通过指明男女来设置性别,还可以通过插入数字1和2来设置性别。如下:

根本原因在于,MySQL出于效率考虑,在存储enum值时实际存储的都是数字,enum中提供的选项值依次对应数字1、2、3、…,最多65535个,因此在设置enum值时可以通过数字的方式进行设置。

通过数字设置set

在插入记录时,除了通过指明多个选项来设置爱好,还可以通过数字的方式来设置。如下:

因为MySQL存储set值时实际存储的也是数字,set中提供的选项值依次对应数字1、2、4、8、…,最多64个,因此在设置set值时可以通过数字的方式进行设置。按照比特位置从低到高,表示set中从左到右的值。

建议:

  • 虽然enum和set可以通过数字的方式进行设置,但严重不推荐这种做法,因为这样的SQL可读性太差,导致后期维护成本变高。

enum和set查找

如果想要筛选出调查表中所有女同志的信息,那么直接在筛选时指明gender='女'即可,因为enum类型的值只能多选一。如下:

但如果要筛选出调查表中爱好包含敲代码的人的信息就比较麻烦了,如果继续使用上述方式,那么最终筛选出来的是爱好仅为敲代码的人的信息。如下:

这时需要借助find_in_set(str,strlist)函数,该函数的作用是查询strlist中是否包含str,如果包含则返回str在strlist中的位置(从1开始),否则返回0。

通过select可以对find_in_set函数进行验证,依次查找集合a,b,c中是否包含字符a、b、d,这时在查找字符a和b时就会得到其在集合中的下标,而在查找字符d时就会得到0值。如下:

这时就可以通过select搭配find_in_set函数,来筛选出爱好包含敲代码的人的信息了。如下:

此外,我们还可以继续添加筛选条件,比如筛选出爱好中包含敲代码,但爱好又不仅仅是敲代码的人的信息。如下:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/127231.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CocosCreator3.8研究笔记(十二)CocosCreator 字体资源理解

Cocos Creator 常用的字体资源有三种:系统字体、动态字体、位图字体。 一、系统字体 系统字体是调用运行平台自带的系统字体来渲染文字,不需要用户在项目中添加任何相关资源。 使用系统字体, Label 组件 Use System Font 属性需要勾选。 Fo…

手写签名到背景上合为1张图

手写签名到背景上合为1张图 package.json中 "signature_pad": "3.0.0-beta.3"<template><div class"home"><canvas id"canvas" width"500" height"300"></canvas><button click"…

【计算机基础知识4】网络通信协议:TCP、UDP、WebSockets

目录 一、TCP&#xff08;传输控制协议&#xff09; 1. TCP的特点 2. TCP的连接建立和终止 3. TCP的可靠性机制 4. TCP的流量控制 二、UDP&#xff08;用户数据报协议&#xff09; 1. UDP的特点 2. UDP的使用场景 三、WebSockets 1. WebSockets协议的特点 2. WebSock…

长安链BaaS服务平台调研

目录 一、菜单功能二、其他说明2.1、服务平台的部署方式2.2、链本身2.3、建链流程2.4、支持连接已部署的链2.5、链治理投票2.6、支持动态节点操作2.7、支持应用 长安链ChainMaker管理平台文档地址&#xff1a;https://docs.chainmaker.org.cn 一、菜单功能 菜单子菜单/功能点…

强大的JTAG边界扫描(1):基本原理介绍

文章目录 1. 什么是边界扫描&#xff1f;2. JTAG硬件接口3. 边界扫描相关的软硬件4. 学习资料5. 总结 我是怎么了解到边界扫描的呢&#xff1f; 这就要从我淘到一块FPGA板卡的事情说起了。 前段时间我在某二手平台上淘了一块FPGA板子&#xff0c;它长这样&#xff1a; 板子的…

【广州华锐互动】元宇宙技术如何赋能传统工业企业?

随着科技的飞速发展&#xff0c;我们正处于工业革命4.0的时代&#xff0c;数字化、网络化和智能化正在深刻地改变着我们的生活和工作方式。在这个变革的大潮中&#xff0c;工业元宇宙平台应运而生&#xff0c;为企业带来了前所未有的机遇和挑战。 广州华锐互动开发的工业元宇宙…

vite搭建vue3项目

参考视频 1.使用npm搭建vite项目,会自动搭建vue3项目 npm create vitelatest yarn create vite2.手动搭建vue3项目 创建一个项目名称的文件夹执行命令&#xff1a;npm init -y 快速的创建一个默认的包信息安装vite: npm i vite -D -D开发环境的依赖 安装vue,现在默认是vue3.…

nodejs下载指定版本

1.搜索nodejs打开官网nodejs官网&#xff08;除了去官网下载之外还可以使用nvm下载&#xff09; 2.点击downloads 3.往下滑点击Previous Releases(以前的版本) 4.找到你想下载的版本点开&#xff08;此处可能没你想要的具体版本&#xff0c;没关系找到大版本号相同的点开就行了…

【PowerQuery】Excel 的自动刷新功能-最低一分钟刷新

在Excel集成了PowerQuery之后,它提供了数据的手动刷新功能之外,也提供了数据的自动刷新功能。需要注意的是,PowerQuery提供的自动刷新功能是针对连接的,也就是说在PowerQuery自动刷新功能不是全局刷新功能,而是针对连接本身提供。接下来我们来看一下如何实现PowerQuery连接…

快速实现抖音上下滑动,你不知道的ViewPager2用法,信息量巨大,建议收藏点赞。老tier~

万能ViewPager2适配器–SmartViewPager2Adapter 特点功能 完全脱离xml&#xff0c;所有效果只需要通过api调用 具体功能&#xff1a;1. 两句代码实现抖音列表效果2. 无感且丝滑&#xff0c;动态从头部或者底部加载数据3. 设置上下加载监听&#xff0c;再达到预加载limit的时…

Python之面向对象(一)

目录 面向对象为什么要面向对象&#xff1f;要素 定义一些特性内存空间实例的创建与初始化创建实例方法__new__初始化实例方法__init__ 类的继承多态新式类与经典类 面向对象 为什么要面向对象&#xff1f; 方便版本更新迭代&#xff0c;程序结构清晰明了 要素 类&#xff…

Java(三)逻辑控制(if....else,循环语句)与方法

逻辑控制&#xff08;if....else&#xff0c;循环语句&#xff09;与方法 四、逻辑控制1.if...else(常用)1.1表达格式&#xff08;三种&#xff09; 2.switch...case(用的少)2.1表达式 3.while(常用)3.1语法格式3.2关键字beak&#xff1a;3.3关键字 continue&#xff1a; 4.for…

【web开发】6、Django(1)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、Django是什么&#xff1f;二、使用步骤1.安装Django2.创建项目3.创建app4.快速上手 数据库操作1.安装第三方模块2.自己创建数据库3.DJango链接数据库4.DJango操…

vue 部署到本机IIS 部署 SPA 应用

安装 URL Rewrite Works With: IIS 7, IIS 7.5, IIS 8, IIS 8.5, IIS 10 URL Rewrite : The Official Microsoft IIS Site 目前电脑IIS是6版本的&#xff0c;以下的方法不太合适操作。目前用Nginx部署&#xff0c;够用了。 nginx配置参考&#xff1a; uni-app 前面项目&am…

2023年09月编程语言流行度排名

点击查看最新编程语言流行度排名&#xff08;每月更新&#xff09; 2023年09月编程语言流行度排名 编程语言流行度排名是通过分析在谷歌上搜索语言教程的频率而创建的 一门语言教程被搜索的次数越多&#xff0c;大家就会认为该语言越受欢迎。这是一个领先指标。原始数据来自…

无需麻烦验证,文字验证码一键通过

前言 文字验证码&#xff0c;简单易用&#xff0c;安全可靠&#xff01;不需要麻烦的图形识别。这种验证方式不仅方便快捷&#xff0c;而且能有效防止恶意攻击和机器人访问。无需担心复杂操作&#xff0c;只需几秒钟就能完成验证过程。保护您的个人信息和数据安全&#xff0c;…

QML与C++的交互操作

QML旨在通过C 代码轻松扩展。Qt QML模块中的类使QML对象能够从C 加载和操作&#xff0c;QML引擎与Qt元对象系统集成的本质使得C 功能可以直接从QML调用。这允许开发混合应用程序&#xff0c;这些应用程序是通过混合使用QML&#xff0c;JavaScript和C 代码实现的。除了从QML访问…

『SpringBoot 源码分析』run() 方法执行流程:(2)刷新应用上下文-准备阶段

『SpringBoot 源码分析』run() 方法执行流程&#xff1a;&#xff08;2&#xff09;刷新应用上下文-准备阶段 基于 2.2.9.RELEASE问题&#xff1a;当方法进行了注释标记之后&#xff0c;springboot 又是怎么注入到容器中并创建类呢&#xff1f; 首先创建测试主程序 package …

SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)

目录 一&#xff0c;SpringBoot中读取配置文件的常用方法1.1&#xff0c;使用Value读取1.2&#xff0c;使用ConfigurationProperties1.3&#xff0c;使用Environment1.4&#xff0c;自定义配置文件读取 二&#xff0c;SpringBoot部署war项目到tomcat9和启动原理 一&#xff0c;…

Day_13 > 指针进阶(2)

目录 1.函数指针数组 2.指向函数指针数组的指针 3.回调函数 qsort()函数 代码示例 void* 4.结束 今天我们在进阶指针的基础上&#xff0c;学习进阶指针的第二部分 1.函数指针数组 首先我们回顾一下指针数组 char* arr[5]://字符指针数组 - 数组 - 存放的是字符指针 in…