MySQL之数据类型

目录

一、MySQL数据类型分类

二、数值类型

1、整数类型

2、bit类型

3、小数类型

三、字符串类型

1、char

2、varchar

3、char和varchar比较

四、日期和时间类型

五、enum和set


一、MySQL数据类型分类

MySQL 数据类型可以大致分为以下三类:

  • 数值类型:用于存储整数、小数、浮点数等数值数据。MySQL 支持所有标准 SQL 数值数据类型,包括 INTEGER、SMALLINT、DECIMAL、NUMERIC、FLOAT、REAL 和 DOUBLE PRECISION。此外,MySQL 还支持一些扩展的数值类型,如 TINYINT、MEDIUMINT、BIGINT 和 BIT。数值类型的选择要考虑存储范围、精度和空间效率等因素。
  • 日期/时间类型:用于存储日期和时间值,如年份、日期、时间戳等。MySQL 支持的日期/时间类型有 YEAR、TIME、DATE、DATETIME 和 TIMESTAMP。日期/时间类型的选择要考虑存储格式、时区和自动更新等因素。
  • 字符串类型:用于存储文本或二进制数据,如字符、文本、枚举等。MySQL 支持的字符串类型有 CHAR、VARCHAR、BINARY、VARBINARY、BLOB、TEXT、ENUM 和 SET。字符串类型的选择要考虑存储长度、字符集和排序规则等因素。

二、数值类型

1、整数类型

这里用MySQL的tinyint类型举例,来说明整数类型的用法

mysql> create table tt1(num tinyint);mysql> insert into tt1 values(1);mysql> insert into tt1 values(128); //-- 越界插入,报错
mysql> select * from tt1;

说明 :
MySQL 中,整型可以指定是有符号的和无符号的,默认是有符号的。 可以通过UNSIGNED 来说明某个字段是无符号的。
mysql> create table tt2(num tinyint unsigned);
mysql> insert into tt2 values(-1); //-- 无符号,范围是: 0 - 255mysql> insert into tt2 values(255);mysql> select * from tt2;

注意:使用有符号的和无符号是根据业务要求来选择的,没有哪种更好的说法。

2、bit类型

基本语法

bit(M) : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。
mysql> create table tt4 ( id int, a bit(8));
mysql> insert into tt4 values(10, 10);
mysql> select * from tt4;

我们发现发现很怪异的现象,a的数据10没有出现,这是因为bit字段在显示时,是按照ASCII码对应的值显示。

示例:

mysql> insert into tt4 values(65, 65);
mysql> insert into tt4 values(65, 'A');
mysql> select * from tt4;

如果我们有这样的值,比如性别,只存放 0 1 ,这时可以定义 bit(1) 。这样可以节省空间。
mysql> create table tt5(gender bit(1));
mysql> insert into tt5 values(0);mysql> insert into tt5 values(1);mysql> insert into tt5 values(2); //会发生越界

3、小数类型

1、float类型

语法:float[(m, d)] [unsigned] : M指定数字位数总长度,d指定小数位数,占用空间4个字节
//m和n根据需求设置
(1)float(4,2) 表示的范围是 -99.99 ~ 99.99 MySQL 在保存值时会进行四舍五入。

示例:

mysql> create table tt6(id int, salary float(4,2));mysql> insert into tt6 values(100, -99.99);mysql> insert into tt6 values(101, -99.991); //多的这一点会四舍五入mysql> select * from tt6;

四舍五入后如果数字超过范围,数据插入会失败。

(2)如果定义的是 float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99

create table tt7(id int, salary float(4,2) unsigned);mysql> insert into tt7 values(100, -0.1);mysql> insert into tt7 values(100, 99.99);

2、decimal类型

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

decimal和float都是用来表示小数的数据类型,但它们有不同的特点和用途。
decimal是一种定点数,它用128位二进制来存储一个十进制数,可以保证小数的精度不会丢失,常用于金融运算或者要求高精度的场合。

示例:

mysql> create table tt8 ( id int, salary float(10,8), salary2 decimal(10,8));
mysql> insert into tt8 values(100,23.12345612, 23.12345612);mysql> select * from tt8;

建议:如果希望小数的精度高,推荐使用decimal。

三、字符串类型

1、char

语法:char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255//这里的字符不是C或者C++的字符,而是一个符号,比如数字、字母或者汉字等等
create table tt9(id int, name char(2));mysql> insert into tt9 values(100, 'ab');mysql> insert into tt9 values(101, '字符');mysql> insert into tt9 values(101, '123');

char 最多只能放255个字符

2、varchar

语法:varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节//注意这里是字节,不是字符

示例:

mysql> create table tt10(id int ,name varchar(6)); //表示这里可以存放6个字符
mysql> insert into tt10 values(100, 'hello');
mysql> insert into tt10 values(100, '我爱你,中国');
mysql> select * from tt10;

关于 varchar(len), 这个 len 值,和表的编码密切相关
varchar字节 长度可以指定为 0 65535 之间的值,但是有 1 - 3 个字节用于记录数据大小,所以说有效字 节数是65532 。 当我们的表的编码是utf8 时, varchar(n) 的参数 n 最大值是 65532/3=21844[ 因为 utf中,一个字符占用3个字节 ] ,如果编码是 gbk varchar(n) 的参数 n 最大是 65532/2=32766 (因为 gbk中,一个字符占用2 字节)。
mysql> create table tt11(name varchar(21845))charset=utf8; //验证utf8确实是不
能超过21844mysql> create table tt11(name varchar(21844)) charset=utf8;

我们再来新建一张表,这次我们在tt11的基础上加一个id列,结果我们发现失败了

create table tt12(id int,name varchar(21844))charset=utf8;

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs

这条SQL语句会失败的原因是name字段的长度 超过了表的最大行长度(max row size,65535 bytes)。根据MySQL的文档, 表的最大行长度是65535字节,不管使用什么存储引擎。而varchar(21844)类型的字段在utf8字符集下,每个字符最多占用3个字节,所以name字段最多占用65536字节,超出了限制。
 

可是就目前来看,varchar除了范围比char大一点,它们还有什么区别吗?我们接着往下看

3、charvarchar比较

那么如何选择char和varchar呢?可以根据以下几点

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

四、日期和时间类型

常用的日期有如下三个:
date : 日期 'yyyy - mm - dd' ,占用三字节
datetime 时间日期格式 'yyyy - mm - dd HH:ii:ss' 表示范围从 1000 9999 ,占用八字节
timestamp :时间戳,从 1970 年开始的 yyyy - mm - dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
案例:
mysql> create table birthday (t1 date, t2 datetime, t3 timestamp);mysql>  insert into birthday(t1,t2) values('2001-12-07','2001-01-01 12:00:00');
mysql> select * from birthday;

注意:添加数据时,时间戳自动补

mysql> update birthday set t1='1999-12-07';mysql> select * from birthday;

更新数据,时间戳会更新

五、enumset

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

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

示例:

mysql> create table votes(-> name varchar(32),-> gender enum('男','女'),-> hobby set('游戏','动漫','音乐')-> );

现在往表里添加数据,添加数据时可以直接写入选项,也可以用下标(enum)或者用位图(set)来表示。

mysql> insert into votes values('kevin','男','游戏,音乐');mysql> insert into votes values('kiana','2',3);mysql> select*from votes;

可以发现,set的1,2,3......不是下标,而是要看成由01组成的位图,是1就表示选中。

查询数据示例:

select*from votes where hobby='游戏';

但是这样只能查出爱好只是游戏的人,不能查询出所有的,游戏是其爱好的人。
所以我们需要学习: 集合查询 find_ in_ set 函数:

find_in_set函数的语法是:find_in_set(str, strlist),其中str是要查找的字符串,strlist是由逗号分隔的字符串列表。例如,find_in_set(‘b’, ‘a,b,c,d’)返回2,因为’b’在’a,b,c,d’中的位置是2。

find_in_set函数可以用在where子句中,来筛选出满足某个条件的记录。例如,如果有一个表test1,其中有一个字段list,存储了一些由逗号分隔的值,如’篮球,足球,羽毛球’,那么可以用find_in_set函数来查询出包含’足球’的记录。

mysql> select*from votes where find_in_set('动漫',hobby);mysql> select*from votes where find_in_set('游戏',hobby) and find_in_set('动漫',hobby);

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

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

相关文章

git快速查看某个文件修改的所有commit

1. git blame file git blame 可以显示历史修改的每一行记录,有时候我们只想了解某个文件一共提交几次commit,只显示commit列表,这种方式显然不满足要求。 2.git log常规使用 (1)显示整个project的所有commit (2)显示某个文件的所有commit 这是git log不添加参数的常规…

.Net MVC 使用Areas后存在相同Controller时报错的解决办法; 从上下文获取请求的Area名及Controller名

先来说个额外的问题:如何在请求上下文(比如过滤器的中)获取请求对应的Area和Controller 名字?(假设请求上下文对象为 filterContext ): 1. 获取Area名: (string)filterContext.RouteData.DataTo…

Windows下防火墙端口配置

在电脑或者服务器上部署某个应用后,如果需要对外提供服务可能就需要在主机防火墙上设置开启需要的端口,那么具体怎样操作呢 1.打开windows防火墙 2.设置防火墙入站规则 如下图“高级安全Windows Defender 防火墙”页面,点击左侧“入站规则”…

并联电容器交流耐压试验方法

对被试并联电容器两极进行充分放电。 检查电容器外观、 污秽等情况, 判断电容器是否满足试验要求状态。 用端接线将并联电容器两极短接连接湖北众拓高试工频耐压装置高压端, 外壳接地。 接线完成后经检查确认无误, 人员退出试验范围。 接入符合测试设备的工作电源,…

[Linux]进程间通信--管道

[Linux]进程间通信–管道 文章目录 [Linux]进程间通信--管道进程间通信的目的实现进程间通信的原理匿名管道匿名管道的通信原理系统接口管道特性管道的协同场景管道的大小 命名管道使用指令创建命名管道使用系统调用创建命名管道 进程间通信的目的 数据传输:一个进…

【多线程】常见的锁策略

常见的锁策略 1. 乐观锁 vs 悲观锁2. 读写锁 vs 普通互斥锁3. 重量级锁 vs 轻量级锁4. 自旋锁(Spin Lock)vs 挂起等待锁5. 公平锁 vs 非公平锁6. 可重入锁 vs 不可重入锁7. Synchronized8. 相关面试题 1. 乐观锁 vs 悲观锁 悲观锁: 总是假设…

GStreamer MIME类型

MIME type的全称是 Multipurpose Internet Mail Extensions (MIME) ,可以标志一个文件的类型。 Table of Audio Types Media Type Description All audio types. audio/* All audio types channels integer channel-mask bitmask format string layou…

NLP机器翻译全景:从基本原理到技术实战全解析

目录 一、机器翻译简介1. 什么是机器翻译 (MT)?2. 源语言和目标语言3. 翻译模型4. 上下文的重要性 二、基于规则的机器翻译 (RBMT)1. 规则的制定2. 词典和词汇选择3. 限制与挑战4. PyTorch实现 三、基于统计的机器翻译 (SMT)1. 数据驱动2. 短语对齐3. 评分和选择4. PyTorch实现…

MybatisPlus分页插件使用

一. 效果展示 二. 代码编写 2.1 pom <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency>2.2 添加配置类 Configuration MapperScan(…

软考知识汇总--结构化开发方法

文章目录 1 结构化开发2 耦合3 内聚4 设计原则5 系统文档6 数据流图6.1 数据流图的基本图形元素 7 数据字典 1 结构化开发 结构化方法总的指导思想是自顶向下、逐层分解&#xff0c;它的基本原则是功能的分解与抽象。它是软件工程中最早出现的开发方法&#xff0c;特别适合于数…

U3D外包开发框架及特点

U3D&#xff08;Unity3D&#xff09;是一款流行的跨平台游戏开发引擎&#xff0c;用于创建2D和3D游戏以及交互性应用程序。U3D有许多常用的开发框架和库&#xff0c;这些框架和库可以扩展其功能&#xff0c;使开发人员更轻松地构建游戏和应用程序。以下是一些常用的U3D开发框架…

Si3262 一款低功耗刷卡+触摸+mcu 三合一SOC芯片

Si3262是-款高度集成的低功耗soC芯片&#xff0c;其集成了基于RISC-V 核的低功耗MCU和工作在13.56MHz的非接触式读写器模块。 该芯片ACD模式下刷卡距离可达4-5cm&#xff08;天线决定&#xff09;&#xff0c;适用于智能门锁&#xff0c;电子锁&#xff0c;柜锁&#xff0c;桑拿…

Android相机调用-CameraX【外接摄像头】【USB摄像头】

Android相机调用有原生的Camera和Camera2&#xff0c;我觉得调用代码都太复杂了&#xff0c;CameraX调用代码简洁很多。 说明文档&#xff1a;https://developer.android.com/jetpack/androidx/releases/camera?hlzh-cn 现有查到的调用资料都不够新&#xff0c;对于外接摄像…

【C++】仿函数和priority_queue(优先级队列)

目录 一、仿函数 二、priority_queue(优先级队列) 1、概念&#xff1a; 2、使用&#xff1a; 3、数组中第K个最大元素 4、priority_queue的模拟实现 一、仿函数 ①、概念&#xff1a; 仿函数&#xff0c;即函数对象。一种行为类似函数的对象&#xff0c;调用者可以像函…

Java+Tif图片转Jpg

Tif转Jpg使用心得&#xff1a; 如果tif图片需要压缩&#xff0c;或者需要做转换&#xff0c;常用方法&#xff1a; File file1 new File("E:\\www\\ffw\\images\\73.jpg");byte[] bigContent Files.readAllBytes(file1.toPath());ByteArrayInputStream byteArrayIn…

解决Maven依赖下载问题:从阿里云公共仓库入手

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

安装RabbitMQ的各种问题(包括已注册成windows服务后,再次重新安装,删除服务重新注册遇到的问题)

一、安装Erlang&#xff08;傻瓜式安装&#xff09; 安装完成之后&#xff0c;配置环境变量&#xff1a; 1.新建系统变量名为&#xff1a;ERLANG_HOME 变量值为erlang安装地址 2. 双击系统变量path&#xff0c;点击“新建”&#xff0c;将%ERLANG_HOME%\bin加入到path中。 …

c++类与对象(中)

文章目录 前言一、构造函数1、构造函数介绍2、构造函数特性 二、析构函数1、析构函数介绍2、析构函数特性 三、拷贝构造函数1、拷贝构造函数介绍2、拷贝构造函数特征3、拷贝构造函数的应用 -- 求n天后的日期 四、赋值运算符重载1、运算符重载2、一些运算符重载的实现3、赋值运算…

C++数据结构X篇_12_树的基本概念和存储

学习二叉树之前先学习树的概念。 文章目录 1. 树的基本概念1.1 树的定义1.2 树的特点1.3 若干术语 2. 树的表示法2.1 图形表示法2.2 广义表表示法 3. 树的存储3.1 双亲表示法&#xff1a;保存父节点关系3.2 孩子表示法3.3 左孩子右兄弟表示法 1. 树的基本概念 之前所学均为线性…

前端构建工具 webpack 笔记

1、了解 webpack 1、定义&#xff1a;本质上&#xff0c;webpack 是一个用于现代 JavaScript 应用程序的静态模块打包工具&#xff0c;当 webpack 处理应用它会在内部从一个或多个入口点构建一个依赖图(dependency graph)&#xff0c;然后将你项目中所程序时&#xff0c;需的…