MySql数据库中数据类型

        本篇将介绍在 MySql 中的所有数据类型,其中主要分为四类:数值类型、文本和二进制类型、时间日期、String 类型。如下(图片来源:MySQL数据库):

        目录如下:

目录

数值类型        

1. 整数类型

2. bit 类型

3. 浮点数类型

字符串类型

1. char 类型

2. varchar

3. 如何选择 char 和 varchar

日期和时间类型

enum和set

数值类型        

        数值类型的数据又主要分为两类,整数类型和浮点数类型还有 bit 类型,对于整数类型来说,占多少位就可以表示多少位数的大小,若不在定义变量的后面带上 unsigned 关键字修饰,则为有符号整数,其表示范围为:-2 ^ (n-1) ~ 2 ^ (n - 1) - 1,若带上 unsigned 关键字修饰,则表示的范围为 :2 ^ n - 1,其中 n 代表的是数据类型的位数。

1. 整数类型

        对于整数类型,tinyint 数据类型占一个字节、smallint 占用两个字节、mediumint 占三个字节、int 占四个字节、bigint 占八个字节。

        我们以 tinyint 类型为例讲解,其余所有的整数类型的操作均和 tinyint 的一致,只是能表示的数据范围不同而已,(tinyint 数据类型为 8 位bit位,一个字节)如下:

        当我们向一个类型为 tinyint 类型的变量插入元素的时候,超过对应的范围就会导致我们插入失败,当我们定义一共 tinyint unsigned 元素的变量的时候,当范围超255的时候也会导致报错,如下:

        对于如上的操作我们就可得出结论:

        1. mysql 中插入数据不合法的数据,会被 mysql 直接给拦截掉,只要我们插入的数据,就一定是合法的数据。

        2. mysql 的中数据类型本身就是一种约束,这种约束会倒逼我们去遵守数据类型的使用,保证数据可预期的,完整的

2. bit 类型

        对于 bit 类型来说,定义的时候为 bit(m),其中 m 表示该 bit 类型的数据有多少位,默认值为 1,最大为64,所以 bit 类型的数据的位数范围为:1 ~ 64 位,如下:

        如上所示,当我们插入对应的元素的时候,超过 bit 位的位数的时候,就会导致插入失败,同时查看的时候,显示方法和整型类型的数据有所区别(若是其他版本的mysql,可能显示不出对应的 bit 类型的数据,因为可能是按照asc码值显示的时候,整个使用我们就可可以将数据转化位十六进制来显示,如下)。

3. 浮点数类型

        对于浮点数类型而言,主要被我们分 float、double 和 decimal 两类,先以 float 为例:语法为:float(m, d) [unsigned]:其中 m 为总显示长度,d 表示小数位数。占用的空间为 4 个字节,如 float(4,2) 表示的范围为 -99.99 ~ 99.99(对于小数的位数已经在定义的时候就已经定下来了,即使我们插入的小数位数没有那么多,都会自动填充0,小数位前的整数就是使用总位数减去小数位数得出,若在 float 后面加上 unsigned 修饰,则只能表示 0 ~ 99.99 的数据),如下:

        当我们插入不合法数据的时候,依然会导致插入失败。但是在浮点数中的小数部分遵守五舍六入(小于等于5舍掉,大于等于六进一),如下:

        但即使是这样的进位规则,若进入的时候导致数据溢出,还是会导致插入失败。但是对于 float 类型而言,在表示数据较大,或者浮点数较多的时候,也会导致精度缺失,如下:

        如上是我们采用默认的 float 类型的数据,当我们使用 double 类型数据的时候,其实也会有精度损失,只能说 double类型能表示的数据范围更大。

        当面对精度损失的时候,我们可以使用 decimal 类型来定义变量,如下:

        如上所示,当我们使用 float 类型的时候,就会出现一定的数据误差,所以平时我们使用浮点数最好使用 decimal 变量类型精度更高。

        float 表示的精度大约是 7 位;

        decimal 整数最大位数 m 为65,支持小数最小位数 d 为30,若 d 被省略,默认为 0,若 m 被省略,默认是10

字符串类型

        在 mysql 中的字符串输入的时候,使用单引号和双引号都可以,但常用的为单引号。

1. char 类型

        对于 char 类型的语法为:char(L),固定长度的字符串,L 是可以存储的长度,单位为字符,最大长度为 255,如下:

        如上所示,当我们将 name 变量定义为 char(2) 类型的数据,这个时候我们插入对应的字符,超过两个的时候,就会报错,在 mysql 中的 char 类型中存储的数据是 字符,而不是字节,特别是在 utf8 编码下的字符,一个字符占3个字节,所以可以存下对应数量的汉字。

2. varchar

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

        关于 varchar(L)中的 L 到底是多大,这个 L 的值和编码密切相关

        varchar 长度可以指定为0 到 65535 之家的值,但有 1 ~ 3 个字节用于记录数据大小,所以有效字节数是 65532;

        但是需要注意的是,这个 varchar 类型的单位是字节,所以在 utf8 编码下的最多能存放 65532/3=21844 个字符,我们在定义的时候也只能最多定义 21844 个字符,若编码是 gbk 编码,则最多定义 65532/2=32766 个字符。如下:

        当我们在 gbk 编码下的数据库中创建对应的表的时候,最多定义 32766 个长度。

3. 如何选择 char 和 varchar

        char 和 varchar 的对比,在 utf8 编码下:

        1. 对于 char 类型,定义长度为 L,字节数为 3*L;

        2. 对于 varchar 类型,定义长度为 L,实际插入字符长度为 n,占字节数为 3 * n + 1;

        那么我们如何选择 char 和 varchar 类型呢?

1. 若数据确定长度都一样长,我们就使用 char,如身份证号码、手机号
2. 若数据长度有变化,我们就使用 varchar,比名字,地址(但是最起码要保证存入的长度我们能存进去)
3. 定长的 char 类型比较浪费磁盘空间,但效率较高
4. 边长的 varchar 类型比较节省空间,但效率较低
5. 定长的意义为,直接开辟好空间
6. 边长的意义为,在补偿过自定义范围的情况下,用多少开辟多少

日期和时间类型

        常用的日期有一下三个:

        date 日期:' yyyy-mm-dd ',占用三个字节

        datetime 时间日期格式:' yyyy-mm-dd HH:ii:ss ' 表示范围从1000 到 9999,占用8字节

        timestamp 时间戳,从1970 年开始,格式和 datetime 一样,但不同的是 timestamp 的值更新之后会是当前的最新值,若不更新就是创建时候的值,如下,创建一个 birthday 的表:

mysql> create table birthday (-> t1 date,-> t2 datetime,-> t3 timestamp-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into birthday(t1,t2) values('1997-7-1','2008-8-8 12:1:1');
Query OK, 1 row affected (0.00 sec)mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 1997-07-01 | 2008-08-08 12:01:01 | 2024-10-23 21:46:49 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)mysql> update birthday set t1='2022-1-1';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from birthday;
+------------+---------------------+---------------------+
| t1         | t2                  | t3                  |
+------------+---------------------+---------------------+
| 2022-01-01 | 2008-08-08 12:01:01 | 2024-10-23 21:48:42 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)

        如上所示,假若我们创建出的 timestamp 类型的数据,在插入时会自动更新成当前时间,但是之后就不会改变了,只有当我们更新表中值的时候,timestamp 类型数据的值就会自动更新

enum和set

        枚举类型的语法:enum('选项1', '选项2', '选项3',...)   ---> 单选类型

        对于枚举的设定,只是提供了若干选项的值,最终在一个单元格中,实际只存储了其中一个值,而且处于效率来说,这些值实际存储的是数字,因为这些选项的每个选项值依次对应如下数字:1,2,3,4,……最多到65535个,所以当我们添加枚举值的时候,也可以添加这些对应的数字编号。

        集合类型的语法:set('选项值1', '选项值2', '选项值3',...)  ---> 多选类型

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

        注:在添加枚举值、集合值的时候不建议使用数字表示,因为不利于阅读。

如下:

mysql> CREATE TABLE votes (->     username VARCHAR(32),->     hobby SET('登山', '游泳', '篮球', '武术'),->     gender ENUM('男', '女')-> );
Query OK, 0 rows affected (0.02 sec)mysql> mysql> insert votes ('张山', '登山,武术', '男');
Query OK, 1 row affected (0.00 sec)mysql> insert votes values ('小红', '登山,游泳', '2');
Query OK, 1 row affected (0.00 sec)mysql> select * from votes where gender=2;
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 小红     | 登山,游泳     | 女     |
+----------+---------------+--------+
1 row in set (0.00 sec)

        当我们在表中查找有关集合元素的时候,不能完全找到对应的元素,如下:

mysql> select * from votes;
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 张山     | 登山,武术     | 男      |
| 小红     | 登山,游泳     | 女      |
| 王明     | 登山,篮球     | 男      |
| 小刘     | 登山          | 男      |
+----------+---------------+--------+
4 rows in set (0.00 sec)mysql> select * from votes where hobby='登山';
+----------+--------+--------+
| username | hobby  | gender |
+----------+--------+--------+
| 小刘     | 登山   | 男     |
+----------+--------+--------+
1 row in set (0.00 sec)

        如上所示,当我们使用查找语句查找 hobby 为登山的时候,只能找到刚好为登山的,不能找到其中有登山的,这个时候我们可以使用函数 find_in_set(sub,str_list),使用方法如下:

mysql> select * from votes where find_in_set('登山', hobby);
+----------+---------------+--------+
| username | hobby         | gender |
+----------+---------------+--------+
| 张山     | 登山,武术     | 男     |
| 小红     | 登山,游泳     | 女     |
| 王明     | 登山,篮球     | 男     |
| 小刘     | 登山          | 男     |
+----------+---------------+--------+
4 rows in set (0.00 sec)

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

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

相关文章

【论文笔记】MLSLT: Towards Multilingual Sign Language Translation

🍎个人主页:小嗷犬的个人主页 🍊个人网站:小嗷犬的技术小站 🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。 基本信息 标题: MLSLT: Towards Multiling…

系统架构设计师教程 第2章 2.6 计算机语言 笔记

2.6计算机语言 ★★★★☆ 2.6.1计算机语言的组成 计算机语言 (Computer Language) 是指用于人与计算机之间交流的一种语言,是人与计算机之间传递信息的媒介。 计算机语言主要由一套指令组成,指令一般包括表达式、流程控制和集合三大部分内容。 表达…

基于JSP的高校食堂食材选购管理系统【附源码】

基于JSP的高校食堂食材选购管理系统 效果如下: 系统首页界面 用户登录页面 食材信息页面 论坛交流界面 管理员登录界面 管理员功能主界面 食材信息管理界面 订单配送管理界面 用户功能主界面 商家功能主界面 司机功能主界面 研究背景 近年来互联网技术的发展使得…

新王Claude 3.5的6大应用场景

Anthropic AI深夜发布了备受期待的Claude 3.5系列更新,包括了全新升级的Claude 3.5 Sonnet和首发的Claude 3.5 Haiku。 Claude 3.5 Sonnet能够理解细微的指令和上下文,识别并纠正自身错误,还能从复杂数据中生成深入的分析和洞察。 结合最先进…

java项目之在线考试系统设计与实现(springboot)

风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的在线考试系统设计与实现。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于JavaWeb技术…

PostgreSQL C++客户端API libpqxx的使用

PostgreSQL是一个先进的、开源的、免费的、功能强大的关系型数据库,缩写版是postgres。它使用一种客户端/服务器(C/S)的模型。一次PostgreSQL会话由下列相关的进程(程序)组成: (1).一个服务器进程,它管理数据库文件、接受来自客户端应用与数据…

C++研发笔记8——C语言程序设计初阶学习笔记6

在第一部分——课前准备的学习中,我就提到了学习C语言的过程中,练习是必不可少的环节,所以本篇笔记我们来进行记录我们学习《C语言程序设计初阶》阶段的第一篇练习文章。 题目一 下面哪个不是C语言内置的数据类型: A.char B.d…

mysql5.7.44 arm 源码编译安装

一、:下载源码:mysql官网:MySQL :: MySQL Downloads #####下载mysql安装包 : 网址:https://www.mysql.com/ 可在页面下载后上传或直接下载。 官网地址首页,拉到最底部,找到社区版本下载&#xf…

财务域——财务信息化

摘要 博文探讨了企业财务信息化相关内容。首先阐述了企业以创造价值为目标,涉及业务、管理和信息三大循环。业务循环涵盖获取 / 支付、转换、销售 / 收款等环节;管理循环包含计划、执行、控制与决策;信息循环强调数据的收集、处理、存储与输…

【Linux | IO多路复用】epoll的底层原理详解

epoll 是一种高效的 I/O 多路复用机制,广泛用于 Linux 系统中,用于处理大量并发的文件描述符。它比传统的 select 和 poll 方法具有更好的性能,特别是在处理大量并发连接时。 1.epoll的设计思路 epoll是在select 出现 N 多年后才被发明的&a…

week08 zookeeper多种安装与pandas数据变换操作-new

课程1-hadoop-Zookeeper安装 Ububtu18.04安装Zookeeper3.7.1 环境与版本 这里采用的ubuntu18.04环境的基本配置为: hostname 为master 用户名为hadoop 静态IP为 192.168.100.3 网关为 192.168.100.2 防火墙已经关闭 /etc/hosts已经配置全版本下载地址&#xff1…

软考(网工)——网络安全

文章目录 🕐网络安全基础1️⃣网络安全威胁类型2️⃣网络攻击类型 🕑现代加密技术1️⃣私钥密码/对称密码体制2️⃣对称加密算法总结3️⃣公钥密码/非对称密码4️⃣混合密码5️⃣国产加密算法 - SM 系列6️⃣认证7️⃣基于公钥的认证 🕒Hash …

MYSQL全局锁、标级锁、行级锁

一、全局锁 全局锁就是对整个数据库实例加锁。 MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新…

好/坏代码实例解读:图文并茂说明

我曾经在某处读到过一句话,基本上有以下内容: “现代世界许多人的生活都依赖于软件,例如控制大型商用客机飞行系统的软件,但软件开发领域大多不受监管。任何人都可以成为自学成才的软件开发人员,并且没有像其他高风险…

python爬虫——Selenium的基本使用

目录 一、Selenium的介绍 二、环境准备 1.安装Selenium 2.安装WebDriver 三、元素定位 1.常用定位元素的方法 2. 通过指定方式定位元素 四、窗口操作 1.最大化浏览器窗口 2.设置浏览器窗口大小 3.切换窗口或标签页 切换回主窗口 4. 关闭窗口 关闭当前窗口 关闭所…

Mkdm的51单片机学习日记:实时时钟DS1302

15.2 SPI时序初步认识 单片机常用的通信协议有三种:SPI,UART,I2C SPI:Serial Peripheral Interface 串行外围设备接口,是一种全双工,同步的通信总线 常用于单片机与EEPROM,FLASH,…

如何使用JMeter进行性能测试的保姆级教程

性能测试是确保网站在用户访问高峰时保持稳定和快速响应的关键环节。作为初学者,选择合适的工具尤为重要。JMeter 是一个强大的开源性能测试工具,可以帮助我们轻松模拟多用户场景,测试网站的稳定性与性能。本教程将引导你通过一个简单的登录场…

w~自动驾驶合集6

我自己的原文哦~ https://blog.51cto.com/whaosoft/12286744 #自动驾驶的技术发展路线 端到端自动驾驶 Recent Advancements in End-to-End Autonomous Driving using Deep Learning: A SurveyEnd-to-end Autonomous Driving: Challenges and Frontiers 在线高精地图 HDMa…

数据结构 - 散列表,初探

今天我们继续学习新的数据结构-散列表。 01定义 我们先来了解一些常见概念名词解释。 散列:散列表的实现叫做散列,是一种实现以常数级时间复杂度执行查找、插入和删除的技术; 散列值:通过散列函数对输入值(key&…

前端零基础入门到上班:【Day2】开发环境VSCode安装

VSCode 安装教程:图文保姆教程 引言 在前端开发中,选择合适的代码编辑器是提高工作效率的重要一步。Visual Studio Code(简称 VSCode)作为一款强大的开源编辑器,因其简洁易用、功能强大、扩展性好而广受开发者喜爱。…