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

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);

相关文章:

MySQL之数据类型

目录 一、MySQL数据类型分类 二、数值类型 1、整数类型 2、bit类型 3、小数类型 三、字符串类型 1、char 2、varchar 3、char和varchar比较 四、日期和时间类型 五、enum和set 一、MySQL数据类型分类 MySQL 数据类型可以大致分为以下三类: 数值类型:用于…...

词法作用域改变词法作用域

一、词法作用域 1.定义: 为什么叫词法作用域?因为大部分标准语言编译器的第一个工作阶段叫作词法化,词法化的过程会对源代码中的字符进行检查,如果是有状态的解析过程,还会赋予单词语义。 简单来说&#xff0…...

关于C++的隐藏 (hidden),重载(overload),重写(override)小结。

关于隐藏 (hidden) 假如继承以后&#xff0c;子类出现父类同名函数&#xff0c; 即使参数的形式不同&#xff0c; 也会导致父类的函数隐藏&#xff0c; 不参与函数匹配&#xff0c;不能使用。 这个链接讲的不错。https://zhuanlan.zhihu.com/p/575423511 #include <iostrea…...

算法通关村18关 | 透析回溯的模板

回溯有清晰的解题模板&#xff0c; void backtracking(参数){if (终止条件){存放结果;return;}for (选择本层中的集合元素&#xff08;画成树&#xff0c;就是树节点孩子的大小) {处理节点;backtracking();回溯&#xff0c;撤销处理结果;}} 1. 从N叉树说起 在回溯之前&#x…...

【论文阅读】Untargeted Backdoor Attack Against Object Detection(针对目标检测的无目标后门攻击)

文章目录 一.论文信息二.论文内容0.摘要1.论文概述2.背景介绍3.作者贡献4.重点图表 一.论文信息 论文题目&#xff1a; Untargeted Backdoor Attack Against Object Detection&#xff08;针对目标检测的无目标后门攻击&#xff09; 发表年份&#xff1a; 2023-ICASSP&#x…...

分库分表---理论

目录 一、垂直切分 1、垂直分库 2、垂直分表 3、垂直切分优缺点 二、水平切分 1、水平分库 2、水平分表 3、水平切分优缺点 三、数据分片规则 1、Hash取模分表 2、数值Range分表 3、一致性Hash算法 四、分库分表带来的问题 1、分布式事务问题 2、跨节点关联查询…...

[golang 流媒体在线直播系统] 2.搭建基于golang的流媒体服务器实现拉流推流,以及Html客户端拉取hls类型的流

一.使用 Go 语言的开源框架Livego搭建流媒体服务器 1.Livego 框架的介绍 Go 语言拥有强大的 服务器性能 ,golang 在语言级别解决了 多进程并发 的问题,支持 多核 CPU均衡使用 ,支持 海量轻量级线程 ,所以非常适合做 流媒体服务器 .而 livego 是基于golang 开发的简单高效的…...

9月12日作业

作业代码 #include <iostream>using namespace std;class Shape { protected:double cir;double area; public://无参构造Shape() {cout<<"无参构造"<<endl;}//有参构造Shape(double c, double a):cir(c), area(a){cout<<"有参构造&quo…...

React框架下如何集成H.265网页流媒体视频播放器EasyPlayer.js?

H5无插件流媒体播放器EasyPlayer属于一款高效、精炼、稳定且免费的流媒体播放器&#xff0c;可支持多种流媒体协议播放&#xff0c;可支持H.264与H.265编码格式&#xff0c;性能稳定、播放流畅&#xff0c;能支持WebSocket-FLV、HTTP-FLV&#xff0c;HLS&#xff08;m3u8&#…...

《向量数据库》——向量数据库的使用场景有哪些?

向量数据库在许多应用领域都有广泛的用途,特别是那些需要存储、检索和分析向量数据的场景。以下是一些常见的向量数据库使用场景: 1、相似性搜索: 推荐系统:用于根据用户的历史行为或兴趣,搜索相似用户或物品,以提供个性化推荐。图像检索:允许用户通过图像查询相似的图像…...

Java 中 List 集合取补集

交集 Intersection 英 [ˌɪntəˈsekʃn] 并集 Union 英 [ˈjuːniən] 差集 difference of set 补集 complement set 英 [ˈkɒmplɪment] Java 中 List 集合取交集 Java 中 List 集合取并集 Java 中 List 集合取差集 Java 中 List 集合取补集 # 求两个集合交集的补集 List&l…...

我的个人网站——宏夏Coding上线啦

网站地址&#xff1a;宏夏Coding Github地址&#xff1a;&#x1f525;&#x1f525;宏夏coding网站&#xff0c;致力于为编程学习者、互联网求职者提供最需要的内容&#xff01;网站内容包括求职秘籍&#xff0c;葵花宝典&#xff08;学习笔记&#xff09;&#xff0c;资源推…...

【机器视觉】喇叭的外圆以及金属内圆的同心度视觉检测--康耐德智能

客户的需求 检测内容 喇叭的外圆以及金属内圆的同心度测量 检测要求 精度0.02mm&#xff0c;速度没要求&#xff0c;抽检产品。 评估 视觉可行性分析 对贵司的样品进行了光学实验&#xff0c;并进行图像处理&#xff0c;原则上可以使用机器视觉进行测试测量。 结果 对所有样…...

STM32WB55开发(2)----修改蓝牙地址

STM32WB55开发----2.修改蓝牙地址 概述硬件准备视频教学样品申请完整代码下载选择芯片型号配置时钟源配置时钟树RTC时钟配置查看开启STM32_WPAN条件配置HSEM配置IPCC配置RTC启动RF开启蓝牙设置工程信息工程文件设置修改置BLE设备公共地址Ble_Hci_Gap_Gatt_Init结果演示 概述 在…...

【1++的C++进阶】之C++11(二)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的C进阶】 文章目录 一&#xff0c;类的新变化二&#xff0c;可变参数模板三&#xff0c;lambda表达式 一&#xff0c;类的新变化 在C03之前&#xff0c;我们的默认成员函数有6个&#xff0c;…...

【VS2022】调试

F9 创建或取消断点 ctrlF9 禁用断点 F5 开始调试&#xff08;到断点处停下来&#xff09; F10 逐过程&#xff08;不进入函数&#xff09; F11 逐语句 F5、F10、F11都可以直接进入调试 【调试】->【窗口】->【监视】&#xff0c;输入变量就可以观察到变量的值。 …...

python:使用RESTful API(flask)调用python程序传递参数,实现Web端调用python程序

问题描述 现有一个用python写的程序&#xff08;或者是一个或几个的函数接口&#xff09;&#xff0c;需要在Web前端调用python写的函数。如果直接用前端java来调用会很不方便&#xff0c;而且会出现各种麻烦的问题&#xff0c;下面给出如何在web前端调用python的接口。 解决…...

贪心算法(Greedy Algorithm)

贪心算法&#xff08;Greedy Algorithm&#xff09;是一种解决优化问题的算法策略。在贪心算法中&#xff0c;每一步都会选择当前情况下最优的选择&#xff0c;而不考虑未来的后果。 贪心算法的基本思想是通过局部最优选择达到全局最优。它并不保证一定能得到全局最优解&#…...

论文阅读 - Outlier detection in social networks leveraging community structure

目录 摘要 1. Introduction 2. Related works 3. Preliminaries 3.1. 模块化度量 3.2. Classes of outliers 3.2.1. 点异常 3.2.2. Contextual anomalies 3.2.3. Collective anomalies 3.3. Problem definition 3.4. Outliers score 4. Methodology 4.1. Proposed appr…...

【操作系统】进程控制

进程控制&#xff1a;创建新进程&#xff0c;撤销已有进程&#xff0c;实现进程状态转换等。 原语&#xff1a;进程控制用的程序段。执行期间不允许中断&#xff0c;用&#xff02;关中断&#xff02;和&#xff02;开中断&#xff02;指令&#xff08;特权指令&#xff09;实…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

算法笔记2

1.字符串拼接最好用StringBuilder&#xff0c;不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

【LeetCode】算法详解#6 ---除自身以外数组的乘积

1.题目介绍 给定一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O…...

Oracle11g安装包

Oracle 11g安装包 适用于windows系统&#xff0c;64位 下载路径 oracle 11g 安装包...

ubuntu系统文件误删(/lib/x86_64-linux-gnu/libc.so.6)修复方案 [成功解决]

报错信息&#xff1a;libc.so.6: cannot open shared object file: No such file or directory&#xff1a; #ls, ln, sudo...命令都不能用 error while loading shared libraries: libc.so.6: cannot open shared object file: No such file or directory重启后报错信息&…...

保姆级【快数学会Android端“动画“】+ 实现补间动画和逐帧动画!!!

目录 补间动画 1.创建资源文件夹 2.设置文件夹类型 3.创建.xml文件 4.样式设计 5.动画设置 6.动画的实现 内容拓展 7.在原基础上继续添加.xml文件 8.xml代码编写 (1)rotate_anim (2)scale_anim (3)translate_anim 9.MainActivity.java代码汇总 10.效果展示 逐帧…...

用 FFmpeg 实现 RTMP 推流直播

RTMP&#xff08;Real-Time Messaging Protocol&#xff09; 是直播行业中常用的传输协议。 一般来说&#xff0c;直播服务商会给你&#xff1a; ✅ 一个 RTMP 推流地址&#xff08;你推视频上去&#xff09; ✅ 一个 HLS 或 FLV 拉流地址&#xff08;观众观看用&#xff09;…...