[MySQL][数据类型]详细讲解

目录

  • 1.说明
  • 1.数据类型分类
  • 2.数值类型
    • 1.int类型
    • 2.bit类型
    • 3.浮点数类型
      • 1.float
      • 2.decimal
  • 3.字符串类型
    • 1.char
    • 2.varchar
    • 3.char和varchar比较
  • 4.日期和时间类型
  • 5.enum和set
    • 1.基本语法
    • 2.查询数据


1.说明

  • MySQL表中建立属性列,列名称 类型
    • num tinyint unsigned;
    • 与C/C++语言相反:unsigned int num;
  • 如果向MySQL特定的类型中插入不合法的数据,MySQL一般都是直接拦截我们,不让我们做对应的操作
    • 反过来,如果已经有数据被成功地插入到MySQL中了,一定插入的是合法的数据
    • 所以,MySQL中,一般而言,数据类型本身也是一种约束
  • 约束:保证数据库中的数据是可预期的,完整的
    • 约束:约束使用者
    • 倒逼程序员,让程序员尽可能进行正确的插入
    • 另外,如果你不是一个很好的使用者,MySQL也能保证数据插入的合法性

1.数据类型分类

请添加图片描述


2.数值类型

1.int类型

请添加图片描述

  • 说明:
    • 在MySQL中,整形可以指定是有符号的和无符号的,默认是有符号的
    • 可以通过UNSIGNED来说明某个字段是无符号的
  • 示例:
create table t1(num tinyint unsigned);
  • 注意:
    • 尽量不使用unsigned,对于int类型可能存放不下的数据,int unsigned同样可能存放不下
      • 与其如此,还不如设计时,将int类型提升为bigint类型
    • 但是具体使用还是要看使用场景

2.bit类型

  • 基本语法:bit[(M)]:位字段类型,M表示每个值的位数,范围从1到64,如果M被忽略,默认为1
  • 示例:
create table t1 ( id int, a bit(8));insert into t1 values(10, 10);select * from tt4; #发现很怪异的现象,a的数据10没有出现
+------+------+
| id   | a    |
+------+------+
| 10   |      |
+------+------+
  • bit使用的注意事项:
  1. bit字段在显示时,是按照ASCII码对应的值显示
insert into t1 values(65, 65);
select * from t1;
+------+------+
| id   | a    |
+------+------+
| 10   |      |
| 65   | A    |
+------+------+
  1. 如果有这样的值,只存放0/1,这是可以定义bit(1),可节省空间
create table t2(gender bit(1));insert into t2 values(0);
insert into t2 values(1);insert into t2 values(2); -- 当插入2时,已经越界了
ERROR 1406 (22001): Data too long for column 'gender' at row 1

3.浮点数类型

1.float

  • 语法:float[(m, d)] [unsigned]:m指定显示长度,d指定小数位数,占用空间4个字节
  • 示例1:float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入
create table t3(id int, salary float(4,2));insert into t3 values(100, -99.99);
insert into t3 values(101, -99.991); #多的这一点被拿掉了select * from t3;
+------+--------+
| id   | salary |
+------+--------+
| 100  | -99.99 |
| 101  | -99.99 |
+------+--------+
  • 示例2:如果定义的是float(4,2) unsigned,因为把它指定为无符号的数,范围是 0 ~ 99.99
create table t4(id int, salary float(4,2) unsigned);insert into t4 values(100, -0.1);show warnings;
+---------+------+-------------------------------------------------+
| Level   | Code | Message                                         |
+---------+------+-------------------------------------------------+
| Warning | 1264 | Out of range value for column 'salary' at row 1 |
+---------+------+-------------------------------------------------+mysql> insert into t4 values(100, -0);
mysql> insert into t4 values(100, 99.99);

2.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表示的精度不一样
    • decimal的精度更准确,因此如果希望某个数据表示高精度,选择decimal
create table t5 ( id int, salary float(10,8), salary2 decimal(10,8));insert into t5 values(100, 23.12345612, 23.12345612);mysql> select * from t5;
+------+-------------+-------------+
| id   | salary      | salary2     |
+------+-------------+-------------+
| 100  | 23.12345695 | 23.12345612 |
+------+-------------+-------------+
  • 说明:
    • float表示的精度大约是7位
    • decimal整数最大位数m为65,支持小数最大位数d是30
      • 如果d被省略,默认为0
      • 如果m被省略,默认是10
  • 建议:如果希望小数的精度高,推荐使用decimal

3.字符串类型

1.char

  • 语法:char(L):固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
    • 此处的字符,真的就是一个字符,而不是一个字节
  • 案例:
mysql> create table t6(id int, name char(2));
mysql> insert into t6 values(100, 'ab');
mysql> insert into t6 values(101, '中国');mysql> select * from tt9;
+------+--------+
| id   | name   |
+------+--------+
| 100  | ab     |
| 101  | 中国    |
+------+--------+
  • 说明:char(2)表示可以存放两个字符,可以是字母或汉字,但是不能超过2个,最多只能是255
    • utf8中,汉字占3个字节,此处可以看出,此处字符!=字节

2.varchar

  • 语法:varchar(L):可变长度字符串,L表示字符长度,最大长度65535个字节
  • 示例:
create table t7(id int ,name varchar(6)); #--表示这里可以存放6个字符insert into t7 values(100, 'hello');
insert into t7 values(100, '我爱你,中国');select * from tt10;
+------+--------------------+
| id   | name               |
+------+--------------------+
| 100  | hello              |
| 100  | 我爱你,中国        |
+------+--------------------+
  • 说明:关于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字节)
create table tt11(name varchar(21845))charset=utf8; #--验证了utf8确实是不能超过21844
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBscreate table tt11(name varchar(21844)) charset=utf8;
Query OK, 0 rows affected (0.01 sec)

3.char和varchar比较

请添加图片描述

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

4.日期和时间类型

  • 常用的日期有如下三个:
    • date:日期 ‘yyyy-mm-dd’,占用三字节
    • datetime:时间日期格式 ‘yyyy-mm-dd HH:ii:ss’,表示范围从1000到 9999,占用八字节
    • timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss,格式和datetime完全一致,占用四字节
  • 示例:
# 创建表
create table birthday (t1 date, t2 datetime, t3 timestamp);# 插入数据:
insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1'); #--插入两种时间
select * from birthday;
+------------+---------------------+-------------------+
| t1         | t2                  | t3                |
+------------+---------------------+-------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2024-1-1 18:28:55 | #--添加数据时,时间戳自动补上当前时间
+------------+---------------------+-------------------+# 更新数据:
update birthday set t1='2000-1-1';
select * from birthday;
+------------+---------------------+-------------------+
| t1         | t2                  | t3                |
+------------+---------------------+-------------------+
| 2000-01-01 | 2008-08-08 12:01:01 | 2024-1-2 18:32:09 | #--更新数据,时间戳会更新成当前时间
+------------+---------------------+-------------------+

5.enum和set

1.基本语法

  • enum:枚举,"单选"类型
    • 该设定只是提供了若干个选项的值,最终一个单元格中,实际只存储了其中一个值
    • 出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,3, …最多65535 个
    • 当添加枚举值时,也可以添加对应的数字编号
enum('选项1', '选项2', '选项3', ...);
  • set:集合,"多选"类型
    • 该设定只是提供了若干个选项的值,最终一个单元格中,设计可存储其中任意多个值
    • 而且出于效率考虑,这些值实际存储的是"数字",因为这些选项的每个选项值依次对应如下数字:1,2,4,8,16,32, … 最多64个
set('选项值1','选项值2','选项值3', ...);
  • 说明:不建议在添加枚举值,集合值的时候采用数字的方式,因为不利于阅读
  • **示例:**有一个调查表votes,需要调查人的喜好, 比如(登山,游泳,篮球,武术)中去选择[可多选],(男,女)[单选]
create table votes(
-> username varchar(30),
-> hobby set('登山', '游泳', '篮球', '武术'), #--使用数字标识每个爱好的时候,采用比特位位置来与set中的爱好对应起来
-> gender enum('男','女')); #--使用数字标识的时候,就是正常的数组下标//插入数据
insert into votes values('雷锋', '登山,武术', '男');
insert into votes values('Juse', '登山,武术', 2);select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| Juse     | 登山,武术      |女      |
+----------+---------------+--------+

2.查询数据

  • 有如下数据,想查找所有喜欢登山的人:
+-----------+---------------+--------+
| username  | hobby         | gender |
+-----------+---------------+--------+
| 雷锋      | 登山,武术      | 男     |
| Juse      | 登山,武术      | 女     |
| LiLei     | 登山          | 男     |
| LiLei     | 篮球          | 男     |
| HanMeiMei | 游泳          | 女     |
+-----------+---------------+--------+
  • 使用如下查询语句:
    • 不能查询出所有,爱好为登山的人
mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby  | gender |
+----------+--------+--------+
| LiLei    | 登山   | 男     |
+----------+--------+--------+
  • 集合查询使用find_ in_ set函数:find_in_set(sub, str_list):
    • 如果sub在str_list中,则返回下标
    • 如果不在,返回0
    • str_list用逗号分隔的字符串
select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
| 1                         |
+---------------------------+select find_in_set('d', 'a,b,c');
+---------------------------+
| find_in_set('d', 'a,b,c') |
+---------------------------+
| 0                         |
+---------------------------+
  • 查询爱好登山的人
select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 雷锋     | 登山,武术      | 男     |
| Juse     | 登山,武术      | 女     |
| LiLei    | 登山          | 男     |
+----------+---------------+--------+

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

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

相关文章

优化Cocos Creator 包体体积

优化Cocos Creator 包体体积 引言一、优化图片文件体积:二、优化声音文件体积:三、优化引擎代码体积:四、 优化字体字库文件大小: 引言 优化Cocos Creator项目的包体体积是一个常见且重要的任务,尤其是在移动设备和网…

【Flowable | 第二篇】使用Flowable实现请假流程

文章目录 3.使用Flowable实现请假流程3.1部署测试环境3.2工作流/我的任务菜单3.3设计请假流程3.4绑定业务表3.5申请请假3.6节点审批人审批3.6.1审批动作3.6.2流程状态 3.使用Flowable实现请假流程 3.1部署测试环境 我们使用开源的若依框架,来实现Flowable请假流程…

17102 “一条路径图”的最大独立集问题

这个问题可以通过动态规划来解决。我们可以定义一个数组f,其中f[i]表示从最左边的节点沿着一条路径到节点vi为止,具有的独立集最大权值之和。然后我们可以通过比较f[i-1],f[i-2]w[i]和w[i]的值,来更新f[i]。 以下是解题步骤&…

应用数学与机器学习基础 - 多任务学习篇

序言 在人工智能的浩瀚星空中,深度学习作为一颗璀璨的明星,正引领着技术革命的新浪潮。随着数据量的爆炸性增长和计算能力的飞跃,深度学习模型在诸多领域展现出了前所未有的性能与潜力。而多任务学习(Multi-Task Learning, MTL&a…

科技云报道:产业为根大模型应用为擎,容联云推动企业营销服场景重塑

科技云报道原创。 “没有应用,光有一个基础模型,不管是开源还是闭源,一文不值。”在2024世界人工智能大会(WAIC 2024)现场,百度创始人、董事长兼首席执行官李彦宏直言。 国产大模型的种类越发丰富&#x…

纯净IP的重要性解析与测评分析

作为连接互联网世界的桥梁,IP地址的纯净度不仅关乎网络访问的速度与稳定性,更是影响着数据安全与隐私保护。今天,我们将带您深入探索纯净IP的重要性,并分享我们对芝麻HTTP与巨量IP这两家提供纯净SOCKS5代理服务的深度测评分析。 一…

AI算法15-弹性网络回归算法Elastic Net Regression | ENR

弹性网络回归算法简介 在机器学习领域中,弹性网络(Elastic Net)是一种结合了L1范数(套索回归)和L2范数(岭回归)的正则化方法。它综合了两者的优点,既可以实现特征选择,又…

ubuntu18修改文件打开数

Ubuntu18永久修改 最大文件打开数和最大线程数 1、查看操作系统: cat /etc/os-release2、查看当前用户设置: ulimit -a 或者: ulimit -nopen files 是当前最大文件打开数量 max user processes是当前最大线程数量 3、永久修改配置&#x…

【学习笔记】4、组合逻辑电路(下)

接前文《【学习笔记】4、组合逻辑电路(上)》 4.4.5 算术运算电路 1. 半加器和全加器 半加器和全加器是算术运算电路中的基本单元。半加器和全加器是1位相加的组合逻辑电路。 (1)半加器 半加器:只考虑两个加数本身,不考虑低位进…

【第27章】MyBatis-Plus之Mybatis X 插件

文章目录 前言一、安装指南二、核心功能1.XML 映射跳转2.代码生成3. 重置模板 三、JPA 风格提示四、常见问题解答1. JPA 提示功能无法使用?2. 生成的表名与预期不符? 五、代码生成模板配置1. 默认模板2. 重置默认模板3. 自定义模板内容3.1 实体类信息3.2…

暑期备考2024小学生古诗文大会:吃透历年真题和知识点(持续)

2024年上海市小学生古诗文大会的自由报名初赛将于10月19日(星期六)正式开始,还有3个多月的时间。 为帮助孩子们备考,我持续分享往年上海小学生古诗文大会真题,这些题目来自我去重、合并后的1700在线题库,每…

Python中的数据容器及其在大数据开发中的应用

在Python编程中,数据容器是存储和组织数据的基本工具。作为大数据开发者,了解并灵活运用各种容器类型对于高效处理大规模数据至关重要。今天,我们将从Set出发,探讨Python中的各种数据容器,以及它们在大数据处理中的应用…

思维+构造,CF 1059C - Sequence Transformation

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1059C - Sequence Transformation 二、解题报告 1、思路分析 n 1,2,3的情况从样例已知 考虑n > 4的情况 我们考虑要字典序最大,自然要最早出现非1的数,…

springboot+vue 开发记录(九)后端打包部署运行

本篇文章主要内容是后端项目写好了,怎么打包部署到服务器上运行。 文章目录 1. 在服务器上安装Docker2. 在Docker中装MySQL3. 在Docker中设置网桥,实现容器间的网络通信4. 修改后端配置文件5. 修改pom.xml文件6. 打包7. 编写DockerFile文件8. 上传文件到…

《昇思25天学习打卡营第17天|K近邻算法实现红酒聚类》

K近邻算法原理介绍 K近邻算法(K-Nearest-Neighbor, KNN)是一种用于分类和回归的非参数统计方法,最初由 Cover和Hart于1968年提出是机器学习最基础的算法之一。它正是基于以上思想:要确定一个样本的类别,可以计算它与所…

CSS【详解】文本相关样式(含 font 系列样式,文本颜色 color,三种颜色表示法,文本排版-含最佳实战范例,文本装饰,分散对齐,渐变色文本等)

文本风格 font-style font-style:italic 值描述normal默认值。浏览器显示一个标准的字体样式。italic加载对应字体的斜体字体文件,若找不到斜体字体文件,则进行物理上的倾斜。 标签默认font-style:italicoblique浏览器会显示一个倾斜的字体样式。 文本粗…

计算机网络——网络层(IP地址与MAC地址、地址解析协议ARP、IP数据报格式以及转发分组、ICMP、IPV6)

IP地址与MAC地址 由于MAC地址已固化在网卡上的ROM 中,因此常常将 MAC地址称为硬件地址或物理地址;物理地址的反义词就是虚拟地址、软件地址或逻辑地址,IP地址就属于这类地址。 从层次的角度看,MAC地址是数据链路层使用的地址&…

Java 面试相关问题(上)——基础问题集合问题

这里只会写Java相关的问题,包括Java基础问题、JVM问题、线程问题等。全文所使用图片,部分是自己画的,部分是自己百度的。如果发现雷同图片,联系作者,侵权立删。 1. Java基础面试问题1.1 基本概念相关问题1.1.1 Java语言…

配置Maven并使用IDEA新建一个简单的Springboot项目

一.maven的配置 1.查看电脑上是否配置了maven ①使用快捷键“WinR”打开运行窗口,在窗口中输入cmd,点击确定进入黑色命令窗口 ②在命令行窗口中输入如下命令 mvn -version 如果出现下面的提示则表示该电脑已配置maven,否则需要进行maven配…

SpringBoot整合Java Mail实现发送邮件

SpringBoot整合Java Mail实现发送邮件 实现 引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>发送邮件配置 这里使用qq邮箱发送邮件&#xff0c;需要…