4.MySQL数据类型

目录

数据类型

​编辑数值类型

tinyint类型

bit类型

float类型

decimal类型

字符串类型

char类型

varchar

varchar和char的区别

日期和时间类型


数据类型

数值类型

说明一下:MySQL本身是不支持bool类型的,当把一个数据设置成bool类型时,数据库会自动将其转换成tinyint(1)的数据类型,其实这个就是变相的bool类型,因为tinyint(1)只有1和0两种取值,可以分别对应bool类型的true和false。

tinyint类型

数值越界测试

mysql> create table t1 (num tinyint);
Query OK, 0 rows affected (0.02 sec)mysql> insert into t1 values(1);
Query OK, 1 row affected (0.01 sec)mysql> insert into t1 values(2);
Query OK, 1 row affected (0.00 sec)mysql> insert into t1 values(127);
Query OK, 1 row affected (0.01 sec)mysql> insert into t1 values(128);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> select * from t1;
+------+
| num  |
+------+
|    1 |
|    2 |
|  127 |
+------+
3 rows in set (0.00 sec)mysql> 

带符号的范围是-128~127,无符号的范围0-255,默认有符号 

有符号的只要插入的范围在-128~127之间的都不会报错,如果插入的范围大于这个区间就会报错。

128不在这个区间,所以不会显示,插入报错了。

tinyint类型(无符号)

mysql> create table t1 (num tinyint unsigned);
ERROR 1050 (42S01): Table 't1' already exists
mysql> create table t2(num tinyint unsigned);
Query OK, 0 rows affected (0.02 sec)mysql> insert into t2 values(128);
Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values(129);
Query OK, 1 row affected (0.00 sec)mysql> insert into t2 values(-129);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2 values(254);
Query OK, 1 row affected (0.01 sec)mysql> insert into t2 values(255);
Query OK, 1 row affected (0.00 sec)mysql> insert into t2 values(256);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2 values(0);
Query OK, 1 row affected (0.00 sec)

无符号的插入范围是在0~255之间 ,在该范围内都可以进行插入,不在这个范围之间不能插入。

建议:除非场景要求数值类型必须是无符号,否则尽量不要使用无符号,因为有符号的数值类型存不下的数据,其对应的无符号类型同样可能存不下,这时应该直接将数值类型进行提升。

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

举例:

mysql> create table t3(id int,a bit(8));
Query OK, 0 rows affected (0.02 sec)
mysql> insert into t3 values(10,10);
Query OK, 1 row affected (0.00 sec)mysql> select *from t3;
+------+------+
| id   | a    |
+------+------+
|   10 | |
+------+------+
1 row in set (0.00 sec)

发生了一个很奇怪的现象,a的数据10没有出现????????

那接下来看下面这个例子:

咦咦咦???为什么插入了65会显示A呢??

根本原因是因为bit类型在显示时,是按照ASCII码对应的值进行显示的,而在ASCII码表中10对应的是控制字符LF,表示换行的意思。如果向表中插入记录时指定id和a的值均为65,由于ASCII码表中65对应的是字符A,因此插入记录后查看表就会发现a的值显示的是A。如下:

bit类型测试

如果我们有个这样的值,只能存放0 1 ,这个时候我们就可以定义bit(1),这样还可以节省空间。

mysql> create table t4(-> gender bit(1)-> );
Query OK, 0 rows affected (0.02 sec)mysql> insert into t4 values(0);
Query OK, 1 row affected (0.00 sec)mysql> insert into t4 values(1);
Query OK, 1 row affected (0.01 sec)mysql> select * from t4;
+--------+
| gender |
+--------+
|        |
|       |
+--------+
2 rows in set (0.00 sec)

当我们插入不是0 1 的数据时

  • 虽然MySQL提供了位类型bit,但一般不建议将数据类型设置成位类型,除非将来这个数据本身就只是给程序看的,并且数据本身非常占用资源。
  • 因为查询位类型数据时,默认会按照ASCII码对应的值进行显示,这对于将来数据库管理员维护数据库或程序员调试程序都是不太方便的。
float类型
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节

案例:

小数:float(4,2)表示范围是-99.99~99.99,MySQL在保存值时会进行四舍五入。

此外,由于MySQL在保存值时会进行四舍五入,因此实际可插入float(4,2)的范围为-99.994~99.994,如果插入的数据不在该范围内,那么插入数据时就会产生报错。如下:

问题:当我们的float(4,2)如果是一个有符号的,则表示范围是-99.99~99.99,如果float(6,3)请问是多少呢??

当然和大家想的一样就是999.999~999.999

float无符号

mysql> create table t6(salary float(4,2) unsigned);
Query OK, 0 rows affected (0.02 sec)mysql> insert into t6 values(0);
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values(-2);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t6 values(3);
Query OK, 1 row affected (0.01 sec)mysql> insert into t6 values(99.995);
ERROR 1264 (22003): Out of range value for column 'salary' at row 1
mysql> insert into t6 values(99.994);
Query OK, 1 row affected (0.00 sec)mysql> select *from t6;
+--------+
| salary |
+--------+
|   0.00 |
|   3.00 |
|  99.99 |
+--------+
3 rows in set (0.00 sec)

无符号float类型的取值范围,实际就是把对应有符号float类型中的负数部分拿走了,因此float(4,2)的取值范围为0~99.99,实际可插入的范围是0~99.994 

decimal类型
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99
  • decimalfloat很像,但是有区别:
  • floatdecimal表示的精度不一样

说明: float 表示的精度大约是 7 位。
decimal 整数最大位数 m 65 。支持小数最大位数 d 30 。如果 d 被省略,默认为 0. 如果 m 被省略,
默认是 10
建议:如果希望小数的精度高,推荐使用decimal

字符串类型

char类型
char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
mysql> create table t8( char1 char(2) );
Query OK, 0 rows affected (0.02 sec)mysql> insert into t8 values('ab');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8 values('hwh');
ERROR 1406 (22001): Data too long for column 'char1' at row 1
mysql> insert into t8 values('h');
Query OK, 1 row affected (0.00 sec)mysql> insert into t8 values('111');
ERROR 1406 (22001): Data too long for column 'char1' at row 1
mysql> insert into t8 values('11');
Query OK, 1 row affected (0.00 sec)

说明:
char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过 2 个, 最多只能是 255
mysql> create table tt10(id int ,name char(256));
ERROR 1074 (42000): Column length too big for column 'name' (max = 255); use
BLOB or TEXT instead

在不同编码中,一个字符所占的字节个数是不同的,比如utf8中一个字符占3个字节,而gbk中一个字符占2个字节。MySQL限定字符的概念不是字节,这样用户就不用关心复杂的编码细节了

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

关于 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 字节)。
varchar和char的区别

如何选择定长或变长字符串?
  • 如果数据确定长度都一样,就使用定长(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 完全一致,占用四字节

案例:

添加数据时,时间戳自动补当前时间

更新数据:时间戳也会自动更新

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

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

相关文章

C#复习之封装_构造函数,析构函数,垃圾回收

知识点一:构造函数 基本概念 在实例化对象时 会调用的用于初始化的函数 如果不写 默认存在一个无参构造函数 构造函数的写法 1.没有返回值 2.函数名和类名必须相同 3.没有特殊需求时 一般都是public的 4.构造函数可以被重载 5.this代表当前调用该函数的对象自己 注…

【多线程】synchronized原理

文章目录 一、锁升级 (面试经常考)偏向锁 二、锁消除三、锁粗化锁的粒度 四、相关面试题 结合 锁策略,我们就可以总结出,synchronized具有以下特性: 乐观悲观,自适应重量轻量,自适应自旋挂起等待,自适应非…

Gradio 快速开发网页应用

Gradio 是一个开源的 Python 框架,可以快速开发页面,Gradio 主要用于 AI 模型 Demo 的开发,通过几行代码可以快速生成一个 Web Demo,由于 AI 算法工程师使用的都是 Python 语言,使用 Python 开发 Demo 会相对简单&…

演示:基于WPF的DrawingVisual开发GS(2019)1822号矢量中国地图一

一、目的:基于WPF的DrawingVisual开发的矢量地图 二、预览 默认样式 深黑样式 深蓝色样式 深蓝色透明样式 演示:基于WPF的DrawingVisual开发GS(2019)1822号矢量中国地图二-CSDN博客VS2022,net7演示:基于WPF的DrawingVisual开发GS…

DVWA—SQL(Blind)实例

DVWA—SQL Injection(Blind)实例 预备知识 在SQL注入中会有回显注入和盲注入的形式,在前面的文章中展示了回显注入的情况,而盲注入就是当我输入查询语句的时候数据并不会直接显示在页面中而是以程序员规定的输出格式来进行显示&…

【数据结构和算法】(基础篇二)——链表

链表 数组最麻烦的地方就是其在建立之后大小固定,对于增删数据很不方便。链表的出现解决了这个问题,链表的元素不是在内存中连续存储的,而是通过指针链接在一起的节点集合,这样的设计让链表有了动态的大小。链表是树和图结构的基…

Windows11 WSL2 Ubuntu编译安装perf工具

在Windows 11上通过WSL2安装并编译perf工具(Linux性能分析工具)可以按以下步骤进行。perf工具通常与Linux内核一起发布,因此你需要确保你的内核版本和perf版本匹配。以下是安装和编译perf的步骤: 1. 更新并升级系统 首先&#x…

Unity数据持久化 之 Json序列化与反序列化

语法规则可以看这篇文章:Unity数据持久化 之 Json 语法速通-CSDN博客 Q:Unity是通过什么来对Json文件进行处理的? A:JsonUtility:Unity 提供了 JsonUtility 类,用于将对象序列化为 JSON 字符串或将 JSON 字符串反序列化为对象。…

大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

DC-5靶机渗透测试

DC-5靶场 文章目录 DC-5靶场信息收集漏洞发现漏洞利用 --- 日志文件包含漏洞利用 --- 文件包含过滤器链的RCEshell反弹权限提升 信息收集 使用--scriptvuln扫描发现了一个thankyou.php界面 感觉会有问题,前往访问网站信息 漏洞发现 来到thankyou.php界面&#xff…

haproxy详解

目录 一、haproxy简介 二、什么是负载均衡 2.1 负载均衡的类型 2.2.1 硬件 2.2.2 四层负载均衡 2.2.3 七层负载均衡 2.2.4 四层和七层的区别 三、haproxy的安装及服务信息 3.1 示例的环境部署: 3.2 haproxy的基本配置信息 3.2.1 global 配置参数介绍 3…

sleuth+zipkin分布式链路追踪

概述 结构图 常见的链路追踪 cat zipkin pinpoint skywalking sleuth Sleuth介绍 Trace Span Annotation 使用Sleuth 添加依赖 <!--sleuth--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starte…

运维工具的衍化对运维工作的新挑战

运维工具的衍化对运维工作产生了深远的影响&#xff0c;这些影响体现在多个方面&#xff0c;包括提升运维效率、优化资源配置、增强故障应对能力、促进团队协作与沟通&#xff0c;以及面临新的挑战如数据安全和隐私保护等。运维工具的衍化对运维工作带来了多方面的新挑战&#…

Yolo-World初步使用

Yolo v8目前已经支持Yolo-World&#xff0c;整理一下初步使用步骤。 使用步骤 1 先下载Yolo-World的pt文件&#xff0c;下载地址&#xff1a;GitHub - AILab-CVC/YOLO-World: [CVPR 2024] Real-Time Open-Vocabulary Object Detection 官网应该是点这里&#xff08;有个笑脸…

【C#】读取与写入txt文件内容

在 C# 中读取和写入文本文件内容是一个常见的任务。以下是使用几种不同方法读取和写入文本文件的示例。 一、读取txt文件内容 1.1 使用 StreamReader using System; using System.IO;class Program {static void Main(){string filePath "C:\path\to\your\file.txt&qu…

QT多语言工具实现支持生成ts文件,ts文件和xlsx文件互转

一. 工具介绍 1.如果你是Qt项目,为多语言发愁的话,看到这篇文件,恭喜你有福啦!工具截图如下:​ 2.在项目开发的过程中,尽量将所有需要翻译的文本放在一个文件中,qml翻译用一个文件,cpp用一个,如下: test.h #pragma once /******************************************…

Java面试篇(线程池相关专题)

文章目录 1. 为什么要使用线程池2. 线程池的核心参数和线程池的执行原理2.1 线程池的核心参数2.2 线程池的执行原理 3. 线程池中常见的阻塞队列3.1 常见的阻塞队列3.2 ArrayBlockingQueue 和 LinkedBlockingQueue 的区别 4. 如何确定线程池的核心线程数4.1 应用程序中任务的类型…

【代码随想录】长度最小的子数组——滑动窗口

本博文为《代码随想录》的学习笔记。原文链接&#xff1a;代码随想录 题目 原题链接&#xff1a;长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, ..., numsr-1, nums…

历史库,成本与性能如何兼得?| OceanBase应用实践

随着数据量的迅猛增长&#xff0c;企业和组织在数据库管理方面遭遇的挑战愈发凸显。数据库性能逐渐下滑、存储成本节节攀升&#xff0c;以及数据运维复杂性的增加&#xff0c;这些挑战使得DBA和开发者在数据管理上面临更大的压力。 为了应对这些挑战&#xff0c;对数据生命周期…

uni-app学习笔记

一、下载HBuilder https://www.dcloud.io/hbuilderx.html 上述网址下载对应版本&#xff0c;下载完成后进行解压&#xff0c;不需要安装&#xff0c;解压完成后&#xff0c;点击HBuilder X.exe文件进行运行程序 二、创建uni-app项目 此处我是按照文档创建的uni-ui项目模板…