【MySQL】数据库数据类型

news2024/10/6 10:41:25

文章目录

  • 1. 整体概要
  • 2. 数值类型
    • (有符号) tinyint 创建表
    • (无符号) tinyint 创建表
    • bit类型
    • float 类型
    • (无符号)float
    • decimal
  • 3. 二进制类型
    • char类型
    • varchar类型
  • 4. 日期时间
    • 日期时间类型
  • 5. string 类型
    • enum类型和set类型
    • enum类型和set类型的查找
      • 在枚举中的查找
      • 在set中的查找

1. 整体概要

看起来分为很多类型,例如数值类型,有一些看一眼就懂啦,所以不会全部介绍

2. 数值类型

(有符号) tinyint 创建表

进入 test_db数据库中,并创建表t1 ,其内部包含 tinyint类型的num


输入 desc t1; 查看t1表结构

tinyint类型为一个字节,有符号,所以取值范围为 -128 到 127


向t1 表中分别插入 -128 、128 、1


输入 select * from t1; 查询 t1 表的结构


由于 -129 和128 超过了 tinyint类型的取值范围,所以插入失败


(无符号) tinyint 创建表

再次创建表,内部包含一个无符号的 tinyint类型的num
所以取值范围为 0 到255


输入 desc t2; 查询t2表的结构


由于取值范围是 0 到255
所以向t2表插入 0 100 255 ,可以插入成功
而向t2表插入 -1,则会插入失败

bit类型

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

先进入 test_db 数据库中,创建一张 t3表
内部包含 int类型的id 、 1字节的online
id 表示 用户某一个身份id
online 表示 当前用户是否登录 (1表示登录 0表示没有登录)


插入 (123 ,0 ) 表示123号用户不在线
插入 (124 ,1 ) 表示 124号用户在线
可当插入 (123,5)时 ,由于 online 的类型为1个比特位,所以只能插入0或者1,所以会报错


输入 select * from t3; 即查看t3表的结构
发现online 对应的位置 什么都看不到
是因为通常以ASCII值形式显示的,而ASCII值在当前是不可显示的


让 online 以十进制方案显示出来
这样就可以看到 0 或者 1


创建表时,bit范围是1到64,而当前设置是65,所以创建表不成功 会报错

float 类型

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


创建一张表t5,包含 int类型的id 以及 float类型的salary,并且salary共有4位,其中2位是小数
id 表示 这个人的身份
salary 表示 这个人的工资
float [ (4,2) ] 的取值范围是 -99.99 和 99.99


向t5表插入 (1,99.99) 和(1,-99.99) ,是可以插入成功的
(float的取值范围是有符号区分的)


若slary为23.46,则插入成功,并且显示为23.46


若slary为23.467,则插入成功,并且显示为23.47 ,因为四舍五入,将其进位


若slary为23.464,则插入成功,并且显示为23.46,因为四舍五入,将其舍去

所以进行浮点数存储时,若要求是2位精度,而传入更多位的精度,mysql就会采用 四舍五入的方式 将数据进行存储


(无符号)float

mysql支持定义符号的浮点数

float [ (4,2) ] 的取值范围为 0 到 99.99

创建一张表t6,内部包含 一个bigint类型的id 以及 无符号的浮点数类型的salary,并且salary共有4位,其中2位是小数


若插入 一个99.999,正常来说小数末尾是9 是要四舍五入的,但是进位 就会超过99.99的取值范围 ,所以会报错


decimal

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

decimal(5,2) 的取值范围是 -999.99 - 999.99
decimal(5,2)unsigned的取值范围是 0 - 999.99
decimal和float很像,但是有区别:
float 和 decimal 表示的精度不一样


创建一张表 t7 ,内部包含 float类型的f1,f1总长度为10 ,其中小数部分为8
以及decimal 类型的f2,f2总长度为4,其中小数部分为2


当插入 99.99 在decimal的取值范围内时,则插入成功
当插入99.999不在decimal的取值范围内时,则插入失败


将属于t7表的 decimal类型的f2 的精度 改为 总长度为10 ,其中小数部分为8


在t7表中的成员 f1和f2中分别插入 23.12345612

输入 select *from t7; 查看t7表的信息 发现 f1是精度方面的问题

float在精度过大时,会进行优化策略
但decimal不会这样,decimal可以完全保证数据的精度

3. 二进制类型

char类型

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


在test_db数据库中,创建一张表t8 ,内部包含 int类型的id 以及 char类型的name


输入 desc t8; 查看t8表中更详细信息
t8表中的name 最多储存2个字符


向t8表中插入 一个字符’a’ 或者插入两个字符’ab’ 时,就可以插入成功
向t8表中插入三个字符’abc’时,就会报错


MySQL中的字符代表一种符号,一个汉字代表一个字符

当插入1个字符 中 和2个字符 中国 时,是可以插入成功的
但当插入 3个字符 中国人时 ,因为最多储存2个字符,所以会报错


varchar类型

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


创建一张表t9,内部包含int类型的id 和 varchar类型的name,最多储存6个字符
并默认字符集为uft8


每一个汉字都可以看做是一个字符
若输入 1个字符 中, 3个字符中国人 都可以插入成功
若输入 7个字符时,就会报错


想要修改 t9表中的name成员的varchar类型 最多储存65536个字符
但是报错显示 最多 为21845 个字符 ,可明明varchar 最大长度为65535个字节

MysQL在存储varchar类型时,是按照utf8编码的
在uft8编码中,一个英文字符等于1个字节,一个中文等于3个字节
假设以中文计算,21845个字符 乘以3 就为 65535 个字节


char为固定长度字符串,类似于c++中的数组
如:char(6) 就表示数组字符个数为6个字符,可能只用了1个字符空间,但是依旧会给6个字符空间

varchar为变长字符串
varchar(len) len定义多大就表示字符空间的上限
如:varchar(6) 可能只用了1个字符空间,就只会分配保存一个字符空间


varchar的字节长度在0 -65535之间 ,需要有1-3个字节用于记录数据的大小
(传入数据的大小不同,有可能数据小 1个字节就能记录,有可能数据太大,就需要3个字节才能记录)
假设有3个字节记录数据,所以有效字节数为65532

当表的编码为utf8时,varchar(len) 的参数 len最大值为 65532/3=218844
(一个字符占用3个字节为例)
所以最大字符个数为 21844


创建一张表t10,内部包含 varchar类型的name ,其最多储存21845个字符
因为超过了21844范围,所以会报错


当表中 name的varchar类型的取值为21844时,就可以创建成功


4. 日期时间

日期时间类型

常用的日期如下:
date:日期 ‘yyy-mm-dd’ (年月日),占用三个字节
datetime: 时间日期格式 ‘yyyy-mm-dd HH: ii:ss’ (年 日 时 分 秒) 表示范围从1000到9999,占用八个字节
timestamp:时间戳 ,从1970年开始的 yyy-mm-dd HH:ii:ss (年 月 日 时 分 秒) 格式和 datetime 完全一致,占用四个字节


创建一张表 t10 ,内部包含 date类型的t1 ,datetime类型的t2,timestamp类型的 t3


输入 desc t10; 查看t10表的更多详细信息
t3的类型为时间戳,默认值为 CURRENT_TIMESTAMP
扩展说明:创建表结构时,向表中插入数据,timestamp会自动更新
而date与datetime 需要外部插入


向t10表中的成员 date类型的t1 和 datetime类型的t2 分别插入 2001-10-02 和2002-10-03 08:00:00

输入 select * from t10; 查看t10表的更详细的信息
发现t3自动更新为当前时间


当输入 update t10 set t1=‘2003-10-04’; 更新t10表中t1的时间
发现t3所表示的时间戳 也会跟着变化

5. string 类型

enum类型和set类型

enum:枚举
enum(‘选项1’,‘选项2’,‘选项3’);
提供若干个选项的值,最终一个单元格中,实际只存储其中一个值
如:问卷调查 性别 只能选男或者女


set :集合
set(‘选项1’,‘选项2’,‘选项3’);
提供若干个选项的值,最终一个单元格中,可存储任意多个值
如:问卷调查 爱好 可以选打羽毛球 乒乓球 篮球等


创建一张表 votes,其中包含 最多存储30字节的名字 、 性别 、 爱好
同时 性别 只能从男或者女中 选择一个
而爱好 可以从 代码 篮球 游泳中 选择一个或者多个


向votes表中插入 姓名为 张三 性别为 男 爱 好为代码


当性别中 插入 0 和3 是不可以的,可插入 1 和 2 是可以的


输入 select * from votes 时,发现 1对应性别男 2对应性别女

所以使用枚举类型,可以使用对应的枚举常量
也可以使用枚举常量对应的下标 (从1开始 分别代表第一个枚举值 依次往后推)


向votes表中插入 姓名 为赵六 、性别为男、 爱好为 代码、篮球、游泳
(不允许插入不存在的爱好,同时也可以选择插入一个爱好或者多个爱好)


enum类型 与 set类型 允许为空

只插入 名字,性别与爱好会显示为NULL
NULL表示什么都没有


’ ’ 表示有东西,但是 为空串

若set类型 对应的爱好 插入 0 ,则显示为空串
若set类型 对应的爱好 插入 1 ,则显示为第一个设置的值 ,依次类推


若set类型 对应的爱好 插入 2,则显示为第二个设置的值
若set类型 对应的爱好 插入 3 ,则显示为第一个设置的值 和第二个设置的值


因为共有3个爱好,所以设置3个比特位 000
从右到左,依次为从低到高
若表示代码,则为 001
若表示篮球,则为 010
若表示代码和篮球,则为011
若表示游泳,则为 100


enum类型和set类型的查找

在枚举中的查找

输入 select * from votes where gender=‘男’;
挑选出votes表中所有男生的信息


输入 select * from votes where gender=‘女’;
挑选出votes表中所有女生的信息


在set中的查找

输入 select * from votes where hobby=‘游泳’;
挑选出votes表中爱好只有游泳的人
有的人爱好是广泛的,其中就包含游泳,但是筛选并不显示


所以需要借助 mysql的筛选函数 —— find_in_set 函数

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


输入 select * frin votes where find_in_set(‘游泳’,hobby);
在votes表 的 hobby 查找所有爱好有游泳 的人


and相当于 C语言的逻辑与
在votes表 的 hobby 查找所有爱好有游泳 以及 爱好有篮球的人

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MOSFET(五):DrMos

一、简介 DrMos(Driver MOSFET)技术是 Intel 于2004年推出的服务器主板节能技术,即把 2 个MOSFET和 1 个MOS驱动器 三合一,集成在一个封装中。集成后的 DrMos 面积是分离MOSFET的 ,功率密度是其 倍,通过搭…

华为eNSP配置专题-BGP路由协议的配置

文章目录 华为eNSP配置专题-BGP路由协议的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、OSPF配置4、BGP配置4.1、BGP的基本配置4.2、BGP中路由的宣告4.3、BGP的监控 5、让PC1和PC2互通5.1、将BGP的路由引入…

【鸿蒙软件开发】ArkTS常用组件之Button

文章目录 前言一、创建按钮1.1 Button创建接口介绍1.2 创建正常的按钮,不包括子组件1.3 创建正常的按钮,包括子组件1.4 按钮的不同样式胶囊按钮(默认类型)圆形按钮普通按钮 二、添加事件2.1 .onClick事件添加事件 三、什么时候使用…

【十四】记一次MySQL宕机恢复过程,MySQL INNODB 损坏恢复

记一次MySQL宕机恢复过程 简介:一个业务数据库疏于运维管理,突然在今天崩溃宕机了,真是让人抓狂,上面也不知道积累了多久的数据,平时也没有定期做好备份,这下岂不是瞎了啊,经过不断的收集信息和…

Base 编码家族:Base16 编码

文章目录 参考环境Base 编码Base 的含义计数系统编码系统 为什么需要 Base 编码?ASCII 编码 Base16 编码概念Base16 字符集 Base16 编码原理编码 Base16 编码特点体积膨胀 参考 项目描述搜索引擎Bing、GoogleAI 大模型文心一言、通义千问、讯飞星火认知大模型、Cha…

Git Bash(一)Windows下安装及使用

目录 一、简介1.1 什么是Git?1.2 Git 的主要特点1.3 什么是 Git Bash? 二、下载三、安装3.1 同意协议3.2 选择安装位置3.3 其他配置(【Next】 即可)3.4 安装完毕3.5 打开 Git Bash 官网地址: https://www.git-scm.com/…

【C++】特殊类实现

一、请设计一个类,不能被拷贝 拷贝只会放生在两个场景中:拷贝构造函数以及赋值运算符重载,因此想要让一个类禁止拷贝, 只需让该类不能调用拷贝构造函数以及赋值运算符重载即可。 C98 将拷贝构造函数与赋值运算符重载只声明不定义…

聚类分析 | Python密度聚类(DBSCAN)

密度聚类是一种无需预先指定聚类数量的聚类方法,它依赖于数据点之间的密度关系来自动识别聚类结构。 本文中,演示如何使用密度聚类算法,具体是DBSCAN(Density-Based Spatial Clustering of Applications with Noise)来…

磁盘清理 | 已经卸载的软件还出现在应用和功能里怎么办?

一句话总结解决方法: 安装Geek Uninstaller,删除卸载残留。 问题描述: 最近磁盘满了,需要删除一些平时不常用的软件,但是发现一个问题。就是已经删除的软件,仍然会出现在“应用与功能”中。并且显示卸载图标为灰色&am…

基于PHP的线上购物商城,MySQL数据库,PHPstudy,原生PHP,前台用户+后台管理,完美运行,有一万五千字论文。

目录 演示视频 基本介绍 论文截图 功能结构 系统截图 演示视频 基本介绍 基于PHP的线上购物商城,MySQL数据库,PHPstudy,原生PHP,前台用户后台管理,完美运行,有一万五千字论文。 现如今,购物网站是商业…

用Python进行websocket接口测试

这篇文章主要介绍了用Python进行websocket接口测试,帮助大家更好的理解和使用python,感兴趣的朋友可以了解下 我们在做接口测试时,除了常见的http接口,还有一种比较多见,就是socket接口,今天讲解下怎么用P…

(一)docker:建立oracle数据库

前言,整个安装过程主要根据docker-images/OracleDatabase/SingleInstance /README.md ,里边对如何制作容器讲的比较清楚,唯一问题就是都是英文,可以使用谷歌浏览器自动翻译成中文,自己再对照英文相互参照来制作提前准备…

P1 缓冲池管理

文章目录 Task1 LRU-K 替换策略Task2 缓冲池管理Task3 读/写页面保护 Task1 LRU-K 替换策略 LRU-K算法:当访问次数达到K次后,将数据索引从历史队列移到缓存队列中(缓存队列时间降序);缓存数据队列中被访问后重新排序&…

Python--循环中的两大关键词 break 与 continue

在Python循环中,经常会遇到两个常见的关键词:break 与 continue break:代表终止整个循环结构 continue:代表中止当前本次循环,继续下一次循环 break: 英 /breɪk/ v. 打破,打碎&#xff0c…

c语言练习95:练习使用双向链表(实现增删改查)

练习使用双向链表&#xff08;实现增删改查&#xff09; 是指针指向了一块被释放的空间 解决方案&#xff1a; plistNULL List.h #pragma once #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<…

java实现多线程下载器

前言&#xff1a; &#x1f44f;作者简介&#xff1a;我是笑霸final&#xff0c;一名热爱技术的在校学生。 &#x1f4dd;个人主页&#xff1a;个人主页1 || 笑霸final的主页2 &#x1f4d5;系列专栏&#xff1a;项目专栏 &#x1f4e7;如果文章知识点有错误的地方&#xff0c;…

2316. 统计无向图中无法互相到达点对数(leetcode)并查集-------------------Java实现

2316. 统计无向图中无法互相到达点对数&#xff08;leetcode&#xff09;并查集-------------------Java实现 题目表述 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为 0 到 n - 1 。同时给你一个二维整数数组 edges &#xff0c;其中 edges[i…

使用IDEA时遇到java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver报错的解决方案

目录 一、项目环境二、可能原因解决方案1. 没有导入mysql的jar包2. mysql的jar包版本问题 一、项目环境 二、可能原因解决方案 1. 没有导入mysql的jar包 先检查项目lib文件夹下有没有mysql的jar包&#xff0c;没有就把jar包复制到该目录下 再检查项目结构中有没有导入mysql…

使用vscode搭建虚拟机

首先vscode插件安装 名称: Remote - SSH ID: ms-vscode-remote.remote-ssh 说明: Open any folder on a remote machine using SSH and take advantage of VS Codes full feature set. 版本: 0.51.0 VS Marketplace 链接: https://marketplace.visualstudio.com/items?it…

掌握 C++ 中 static 关键字的多种使用场景

static是什么 在最开始C中引入了static关键字可以用于修饰变量和函数&#xff0c;后来由于C引入了class的概念&#xff0c;现在static可以修饰的对象分为以下5种&#xff1a; 成员变量&#xff0c;成员函数&#xff0c;普通函数&#xff0c;局部变量&#xff0c; 全局变量 s…