【MySQL 保姆级教学】数据类型全面讲解(5)

数据类型

  • 1. 数据类型分类
    • 1.1 数值类型
    • 1.2 文本和二进制类型
    • 1.3 日期类型
  • 2 数值类型
    • 2.1 TINYINT 类型
      • 2.1.1 默认有符号类型
      • 2.1.2 无符号类型
    • 2.2 INT 类型
      • 2.2.1 默认有符号类型
      • 2.2.2 无符号类型
    • 2.3 BIT 类型
      • 2.3.1 语法
      • 2.3.2 举例
    • 2.4 FLOAT 类型
      • 2.4.1 语法
      • 2.4.2 默认有符号类型
      • 2.4.3 无符号类型
      • 2.4.4 插入特大值
    • 2.5 DECIMAL 类型
      • 2.5.1 语法
      • 2.5.2 举例
  • 3. 字符串类型
    • 3.1 解释MySQL的字符
    • 3.2 CHAR 类型
      • 3.2.1 语法
      • 3.2.2 举例
    • 3.3 VARCHAR 类型(重点)
      • 3.3.1 语法
      • 3.3.2 举例
      • 3.3.3 varchar 能开多大空间?
    • 3.4 CHAR 和 VARCHAR 的比较
  • 4. 日期和时间类型
    • 4.1 简单说明
    • 4.2 示例
  • 5.ENUM 枚举
    • 5.1 语法
    • 5.2 示例
  • 6. SET 集合
    • 6.1 语法
    • 6.2 举例
    • 6.3 find_in_set 函数
      • 6.3.1 语法
      • 6.3.2 举例

1. 数据类型分类

1.1 数值类型

数据类型说明
BIT(M)位类型,M为指定位数,默认值为1,范围1-64
TINYINT [UNSIGNED]带符号的范围为-128~127,无符号的的范围为0 ~ 255,默认有符号
BOOL使用1表示真,0表示假
SMALLINT [UNSIGNED]代符号的是 -2^15 ~ 2^15-1, 无符号的范围是 0~2^16-1
INT [UNSIGNED]代符号的是 -2^31 ~ 2^31-1, 无符号的范围是 0~2^32-1
BIGINT [UNSIGMED]代符号的是 -2^63 ~ 2^63-1, 无符号的范围是 0~2^64-1
FLOAT[(M,D)] [UNSIGNED]M指定长度,D指定小数位数,占用4字节
DOUBLE[(M,D)] [UNSIGNED]精度比FLOAT高,占用8字节
DECIMAL[(M,D)] [UNSIGNED]M指定长度,D指定小数位数
类型所占字节最小值最大值(无符号)最小值(最大值)无符号
TINYINT1-1281270255
SMALLINT2-3276832767065535
MEDIUMINT3-83886088388607016777215
INT4-2147483648214748364704294967295
BIGINT8-92233720368547758089223372036854775807018446744073709551615

1.2 文本和二进制类型

数据类型说明
CHAR(size)固定长度字符串,最大为255
VARCHAR(size)可变长度字符串,最大为65525
BLOB二进制数据
TEXT大文本,不支持全文索引,不支持默认值

1.3 日期类型

数据类型说明
DATEYYYY-MM-DD,仅存储日期部分,不包含时间部分,占三个字节
DATETIMEYYYY-MM-DD HH:MM:SS,不受时区影响,存储的是固定的时间点,占8个字节
TIMESTAMPYYYY-MM-DD HH:MM:SS,可以设置为自动更新为当前时间(使用 DEFAULT CURRENT_TIMESTAMP),占4个字节

2 数值类型

2.1 TINYINT 类型

2.1.1 默认有符号类型

  1. 创建表
    命令:create table t1 (test tinyint );
    在这里插入图片描述
  2. 插入规范的值
    命令:insert into t1 values(1);
    在这里插入图片描述
  3. 插入越界的值
    命令:insert into t1 values(128);
    在这里插入图片描述

2.1.2 无符号类型

  1. 添加列 untest
    命令:alter table t1 add column untest tinyint unsigned;
    在这里插入图片描述
  2. 插入规范值
    命令:insert into t1 (untest) values(128);
    在这里插入图片描述
  3. 插入越界值
    命令:insert into t1 (untest) values(256);
    在这里插入图片描述

2.2 INT 类型

2.2.1 默认有符号类型

  1. 创建表
    命令:create table t2 (test int);
    在这里插入图片描述

  2. 插入规范数据
    命令:insert into t2 values(1);
    在这里插入图片描述

  3. 插入越界数据
    命令:insert into t2 (test) values(2147483648);
    在这里插入图片描述

2.2.2 无符号类型

  1. 新增列 untest
    命令:alter table t2 add column untest int unsigned;
    在这里插入图片描述

  2. 插入规范数据
    命令:insert into t2 (untest) values(1);
    在这里插入图片描述

  3. 插入 有符号类型越界的 2147483648
    命令:insert into t2 (untest) values(2147483648);
    在这里插入图片描述
    注意:尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下,与其如此,还不如设计时,将int类型提升为bigint类型。

2.3 BIT 类型

2.3.1 语法

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

存储和取值:

  • 存储:BIT 类型存储的是二进制位,每个位可以是0或1。
  • 取值:可以使用 CAST 或 CONVERT 函数将 BIT 类型转换为其他类型,以便更容易地查看和处理。

2.3.2 举例

  1. 创建表
    命令:create table t3 (test bit(8));
    在这里插入图片描述

  2. 插入 1
    命令:insert into t3 values(1);
    在这里插入图片描述

  3. 查看数据
    命令:select * from t2;
    在这里插入图片描述
    为什么没有数据呢?

    是空值?肯定不是。因为空值的位置会打印出NULLNULL表示未知的值。这里没打印NULL说明这里有值,但是为什么会打印不出来呢?

    因为,bit字段在显示时,是按照ASCII码对应的值显示。10对应的没有ASCII码值。

  4. 插入一个有的对应ASCII码值的数
    命令:inset into t3 values(64),(65),(66);
    在这里插入图片描述

  5. 再次查看数据
    在这里插入图片描述
    66对应的ASCII码为‘A’

  6. 如果我们有这样的值,只存放0或1,这时可以定义bit(1)。这样可以节省空间。
    在这里插入图片描述

    插入 2
    在这里插入图片描述
    一个比特位只能存储1或0,存储2需要两个比特位

2.4 FLOAT 类型

2.4.1 语法

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

示例:
float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
如果定义的是float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99

2.4.2 默认有符号类型

  1. 创建表
    命令:create table t1 (test float(4,2));
    在这里插入图片描述

  2. 插入规范数据
    命令:insert into t1 values(2.20)
    在这里插入图片描述

  3. 插入三位小数的数据 33.333
    命令:insert into t1 values(33.333);
    在这里插入图片描述
    查询存储的数据:select * from t1;
    在这里插入图片描述
    可以看到,存储的数据是已经四舍五入过的。

  4. 插入三位小数的数据 99.999
    命令:insert into t2 values(99.999);
    在这里插入图片描述
    为什么存储不进去呢?
    答:99.999四舍五入后是100.00,而创建的test列的范围是-99.99~99.99,100.00已经越界了

2.4.3 无符号类型

  1. 添加列
    命令:alter table t1 add column untest float unsigned;
    在这里插入图片描述

  2. 插入规范数据
    在这里插入图片描述

  3. 插入负数
    在这里插入图片描述

2.4.4 插入特大值

  1. 创建表
    命令:create table t2 (n float);
    在这里插入图片描述
  2. 插入特大值后在查看插入的数据
    在这里插入图片描述

2.5 DECIMAL 类型

2.5.1 语法

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

decimal(5,2) 表示的范围是 -999.99 ~ 999.99
decimal(5,2) unsigned 表示的范围 0 ~ 999.99

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

说明:

  • float表示的精度大约是7位。
  • decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。

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

2.5.2 举例

  1. 创建表
    命令:create table t3 (test decimal(15,2));

  2. 插入特大值后再查询。
    在这里插入图片描述

3. 字符串类型

3.1 解释MySQL的字符

utf8中,一个汉字占3个字节;在gbk中一个汉字占2个字节。
那么在MySQL中设置字段为char(2) ,字符集为utf8,为什么能输入“中国呢” ?
答:MySQL中的一个字符表示的是:就是一个字符。而在C/C++中,一个字符代表的是一个字节

3.2 CHAR 类型

3.2.1 语法

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

3.2.2 举例

  1. 创建表
    命令:create table t1 (name char(10));
    在这里插入图片描述

  2. 插入,插入的字符串要用单引号/双引号引注
    在这里插入图片描述

3.3 VARCHAR 类型(重点)

3.3.1 语法

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

3.3.2 举例

  1. 创建表
    命令:create table t2 (name varchar(10));
    在这里插入图片描述

  2. 插入,插入的字符串要用单引号/双引号引注
    命令:insert into t2 values('李明');
    在这里插入图片描述

3.3.3 varchar 能开多大空间?

关于varchar(len),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的表中,数据是按行存储的,其实每一行最大可使用的字节也是65535,再去除需要的站位字符其实也就不能完全存储65535字节大小的数据。可以只设置一行,该行是varchar(21844)

  1. 验证使用utf8字符集最大存储21844个字符
    在这里插入图片描述
    显然,使用utf8字符集最大存储21844个字符。

  2. 验证每行最大存储65535个字节
    在这里插入图片描述
    在这里插入图片描述

    当设置一个字段为65535字节的列后,再添加一个字段为1bit的列失败,显然,每一列的字节为65535。

3.4 CHAR 和 VARCHAR 的比较

实际存储char(4)varchar(4)char占用字节varchar占用字节
abcdabcdabcd4*3=124*3+1=13
aaa4*3=121*3+1=4
abdce数据超过长度数据超过长度

如何选择定长或变长字符串?

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

4. 日期和时间类型

4.1 简单说明

常用的日期有如下三个:

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

4.2 示例

  1. 创建表
    命令:create table t1 (t1 date, t2 datetime, t3 timestamp);
    在这里插入图片描述

  2. 插入,要用单引号把时间引注
    命令:insert into t1(t1,t2) values('2020-10-10, 2020-08-18');
    在这里插入图片描述

  3. 查看数据
    在这里插入图片描述
    没有给t3 列插入数据,为什么t3会有数据呢?
    t3字段是timestamp时间戳,时间戳不用自己插入,当插入数据和更改数据的时候会自动更新。

  4. 再插入数据,然后进行查看
    在这里插入图片描述

  5. 更新数据
    命令:update t1 set t1='2024-8-8';
    在这里插入图片描述

5.ENUM 枚举

5.1 语法

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

5.2 示例

  1. 创建表, 选择 男或女,单选
    命令:create table t1(gender enum('男', '女'));
    在这里插入图片描述
  2. 插入 ‘男’
    命令:insert into t1 values('男');
    在这里插入图片描述
  3. 插入 1
    命令:insert into t1 values(1);
    在这里插入图片描述
  4. 查询 男生的一列,where gender = '男'
    命令:select * from t1 where gender = '男';
    在这里插入图片描述
  5. 查询 男生的一列,where gender = 1
    命令:select * from t1 where gender = 1;
    在这里插入图片描述

6. SET 集合

6.1 语法

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

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

6.2 举例

  1. 创建表,集合中的元素可多选。
    命令:create table t1(hobby set('代码', '羽毛球', '乒乓球' ,''足球', '游泳'));
    在这里插入图片描述

  2. 插入数据,直接说明集合中的元素。引号中为集合的元素,用逗号隔开
    在这里插入图片描述

  3. 插入数据,用数值。
    在这里插入图片描述
    同学们可以发现,插入的数不是和集合中的元素一一对应,那么这是按什么来标准来执行的呢?
    集合不是直接采用下标,而是用bit位
    从低位到高位,对应set的从左到右
    加入插入的是 1, 1的bit位是 0001,最后一位是1,也就是‘代码’
    插入 2 , 2的bit位是 0010 ,倒数第二位是1,也就是‘羽毛球’
    插入3,3的bit位是 0011,后两位是1,是 ‘代码’,’羽毛球‘
    在这里插入图片描述

  4. 查询,直接用集合中的元素。这次想获得含有代码的行。
    命令:select * from t1 where hobby='代码'
    在这里插入图片描述
    显然这不是我们想要的数据。那么,使用数值会怎么样呢?

  5. 使用数值查询含代码 的行,where hobby=1
    命令:select * from t1 where hobby=1;
    在这里插入图片描述
    显然,这也不是我们想要的结果,那么没有办法了吗?
    当然不是,我们可以使用find_in_set函数,也可以使用位运算

    binary 2代表代码 的二进制表示
    在这里插入图片描述

6.3 find_in_set 函数

6.3.1 语法

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

6.3.2 举例

  1. 查询含代码的行
    命令:select * from t1 where find_in_set('代码', hobby);
    在这里插入图片描述

  2. 查询含乒乓球的行
    命令:select *from t1 where find_in_set('乒乓球', hobby);
    在这里插入图片描述

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

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

相关文章

OpenCV高级图形用户界面(20)更改窗口的标题函数setWindowTitle()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在OpenCV中,cv::setWindowTitle函数用于更改窗口的标题。这使得您可以在程序运行时动态地更改窗口的标题文本。 函数原型 void cv::…

keepalived(高可用)+nginx(负载均衡)+web

环境 注意: (1) 做高可用负载均衡至少需要四台服务器:两台独立的高可用负载均衡器,两台web服务器做集群 (2) vip(虚拟ip)不能和物理ip冲突 (3) vip(虚拟ip)最好设置成和内网ip同一网段&#xf…

【Vulnhub靶场】Kioptrix Level 3

目标 本机IP:192.168.118.128 目标IP:192.168.118.0/24 信息收集 常规 nmap 扫存活主机,扫端口 根据靶机IP容易得出靶机IP为 192.168.118.133 nmap -sP 192.168.118.0/24nmap -p- 192.168.118.133 Getshell 开放22端口和80 端口 访问web…

Git极速入门

git初始化 git -v git config --global user.name "" git config --global user.email "" git config --global credential.helper store git config --global --list省略(Local) 本地配置,只对本地仓库有效–global 全局配置,所有…

第十七周:机器学习笔记

第十七周周报 摘要Abstratc一、机器学习——生成式对抗网络(Generative Adversarial Networks | GAN)——(中)1. GAN 的理论介绍2. 用JS散度训练存在的问题3. WGAN 算法4. 拓展——流体 总结 摘要 本周周报主要对GAN进行了详细的…

在ESP-IDF环境中如何进行多文件中的数据流转-FreeRTOS实时操作系统_流缓存区“xMessageBuffer”

一、建立三个源文件和对应的头文件 建立文件名,如图所示 图 1-1 二、包含相应的头文件 main.h 图 2-1 mess_send.h mess_rece.h和这个中类似,不明白的大家看我最后面的源码分享 图2-2 三、声明消息缓存区的句柄 大家注意,在main.c中定义的是全局变…

免费字体二次贩卖;刮刮乐模拟器;小报童 | 生活周刊 #4

Raycast 的两款在线工具 Raycast 公司出品,必属精品,之前的代码转图片工具,交互和颜值都做得很漂亮 现在又新出了一个 图标制作器,一键制作美观好看的图标 猫啃网 没想到像【汇文明朝体】这样免费的字体都被人拿来当成【打字机字…

基于知识图谱的电子元器件问答系统

你还在为寻找电子元器件的相关信息头疼吗?作为一名程序员或电子工程师,在项目中经常需要快速查询电子元件的属性或关联关系。今天给大家介绍一个可以大大提升工作效率的神器——基于知识图谱的电子元器件问答系统。这不仅是你学习和工作的好帮手&#xf…

vue2使用pdfjs-dist实现pdf预览(iframe形式,不修改pdfjs原来的ui和控件,dom层可以用display去掉一部分组件)

前情提要 在一开始要使用pdf预览的时候,第一次选的是vue-pdf,但是vue-pdf支持的功能太少,缺少了项目中需要的一项-复制粘贴功能 之后我一顿搜搜搜,最终貌似只有pdfjs能用 但是网上支持text-layer的貌似都是用的2.09那个版本。 使…

androidStudio编译导致的同名.so文件冲突问题解决

files found with path lib/arm64-v8a/libserial_port.so from inputs: ...\build\intermediates\library_jni\debug\jni\arm64-v8a\libserial_port.so C:\Users\...\.gradle\caches\transforms-3\...\jni\arm64-v8a\XXX.so 解决方式如下: 1.将gradle缓存文件删…

c++迷宫游戏

1、问题描述 程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。 基本要求: 老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;迷宫的墙足够结…

Android 第5种启动模式:singleInstancePerTask

Android 第5种启动模式:singleInstancePerTask 随着 Android 版本的更新,应用启动模式逐渐丰富。在 Android 12 中,新增了一种启动模式——singleInstancePerTask。它是继 standard、singleTop、singleTask 和 singleInstance 之后的第五种启…

大数据新视界 --大数据大厂之 Apache Beam:统一批流处理的大数据新贵

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

OpenCV高级图形用户界面(18)手动设置轨迹条(Trackbar)的位置函数setTrackbarPos()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 该函数设置指定窗口中指定轨迹条的位置。 注意 [仅 Qt 后端] 如果轨迹条附加到控制面板,则 winname 可以为空。 函数原型 void cv…

插件发布新特性,让运动适配更简单。

为了让广大开发者更好的适配各AI运动场景,我们的AI运动识别插件已经迭代了23个版本,最近又迎来了我们的1.5.5小版本更新,本次更新了2个新特性,新特性有助于大家更好的适配新运动,更轻松的开发健身、体育、体测、AR互动…

Veritas NetBackup 10.5 发布,新增功能概览

Veritas NetBackup 10.5 发布,新增功能概览 Veritas NetBackup 10.5 (Unix, Linux, Windows) - 领先的企业备份解决方案 The #1 enterprise backup and recovery solution. 请访问原文链接:https://sysin.org/blog/veritas-netbackup-10/ 查看最新版。…

PPT自动化:快速更换PPT图片(如何保留原图片样式等参数更换图片)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 PPT更换图片 📒1. 安装 `python-pptx` 模块2. 加载PPT文件3. 查找并替换图片3.1 查找图片形状3.2 获取原图片的样式和位置3.3 替换图片4. 保存修改后的PPT文件5. 设置图片的相关参数5.1 设置透明度5.2 设置边框🚀 保留所有参…

基于springboot的网上服装商城推荐系统的设计与实现

基于springboot的网上服装商城推荐系统的设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat11 开发软件:idea 源码获取&#xf…

upload-labs靶场Pass-01

upload-labs靶场Pass-01 分析 查看提示,提示如下 查看源码 function checkFile() {var file document.getElementsByName(upload_file)[0].value;if (file null || file "") {alert("请选择要上传的文件!");return false;}//定义允许上传…

Halcon 使用二维像素分类对图像进行分割

文章目录 算子histo_2dim 计算双通道灰度值图像的直方图class_2dim_sup 使用二维像素分类对图像进行分割 示例 算子 histo_2dim 计算双通道灰度值图像的直方图 histo_2dim(Regions, ImageCol, ImageRow : Histo2Dim : : )Regions (输入对象):在此区域内计算直方图…