4.MySQL数据类型

news2024/9/19 14:17:11

目录

数据类型

​编辑数值类型

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.coloradmin.cn/o/1987301.html

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

相关文章

【ThreadLocal总结】

文章目录 为什么使用ThreadLocalThreadLocal核心ThreadLocal内部结构ThreadLocal内存泄漏解决内存泄漏 为什么使用ThreadLocal 在并发编程中,多个线程同时访问和修改共享变量是一个常见的场景。这种情况下,可能会出现线程安全问题,即多个线程…

AWS生成式AI项目的全生命周期管理

随着人工智能技术的迅速发展,生成式 AI 已成为当今最具创新性和影响力的领域之一。生成式 AI 能够创建新的内容,如文本、图像、音频等,具有广泛的应用前景,如自然语言处理、计算机视觉、创意设计等。然而,构建一个成功…

【Python】pandas:计算,统计,比较

pandas是Python的扩展库(第三方库),为Python编程语言提供 高性能、易于使用的数据结构和数据分析工具。 pandas官方文档:User Guide — pandas 2.2.2 documentation 帮助:可使用help(...)查看函数说明文档&#xff0…

文本编辑器小型架构

C字体库开发之字体列表设计七-CSDN博客 创作不易,小小的支持一下吧!

odoo from样式更新

.xodoo_form {.o_form_sheet {padding-bottom: 0 !important;border-style: solid !important;border-color: white;}.o_inner_group {/* 线框的样式 *//*--line-box-border: 1px solid #666;*//*box-shadow: 0 1px 0 #e6e6e6;*/margin: 0;}.grid {display: grid;gap: 0;}.row …

【数据结构】排序 —— 归并排序(mergeSort)、计数排序、基数排序

Hi~!这里是奋斗的明志,很荣幸您能阅读我的文章,诚请评论指点,欢迎欢迎 ~~ 🌱🌱个人主页:奋斗的明志 🌱🌱所属专栏:数据结构、LeetCode专栏 📚本系…

【数据结构】哈希应用-STL-位图

目录 1、位图的概念 2、位图的设计与实现 2.1 set 2.2 reset 2.3 test 3、C库中的位图 4、位图的优缺点 5、位图相关题目 1、位图的概念 面试题:给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这4…

【Material-UI】按钮组件中的实验性API:Loading按钮详解

文章目录 一、LoadingButton 组件概述1. 组件介绍2. 基本用法 二、LoadingButton 组件的高级用法1. 自定义加载指示器2. 图标与加载位置 三、已知问题与解决方法1. Chrome 翻译工具与 LoadingButton 的兼容性问题 四、实用性与未来展望1. 应用场景2. 未来展望 五、总结 Materia…

共享内存的原理及初识线程

char *str"hello world"; *str-H; 运行时报错,RWX只有R权限。 外设和内存交互以4KB为单位。 虚拟地址32位的划分为10 10 12 前10位对应页表的页目录。 在10位即为页表,页表中存放指定页框的起始物理地址虚拟地址的低12位作为页内偏移。 共…

RedLock算法分析

Redis分布式锁-RedLock算法 手写分布式锁的缺点 Redlock算法设计理念 Redis也提供了Redlock算法,用来实现基于多个实例的分布式锁。 锁变量由多个实例维护,即使有实例发生了故障,锁变量仍然是存在的,客户端还是可以完成锁操作。…

第一篇Linux介绍

目录 1、操作系统 2、Windows和Linux操作系统的区别 3、 Linux 的发行版本 4、 linux 分支 5、 Linux 的含义 6、Linux 特点 1、操作系统 常见操作系统有:Windows、MacOS、Unix/Linux。 类 UNIX Windows:其是微软公司研发的收费操作系统&#xff…

【漏洞复现】JBoss 中间件漏洞

JBoss介绍 JBoss是⼀个基于J2EE的开发源代码的应⽤服务器。JBoss代码遵循LGPL许可,可以在任何商业应⽤中免费使⽤。JBoss是⼀个管理EJB的容器和服务器,⽀持EJB1.1、EJB 2.0和EJB3的规范。但JBoss核⼼服务不包括⽀持servlet/JSP的WEB容器,⼀般…

QTableView使用示例-Qt模型视图委托(MVD)(Model-View-Delegate)

模型视图委托(MVD)是Qt中特有的设计模式,类似MVC设计模式,将MVC设计模式中的Controller当做MVD中的Delegate,两者的概念基本相同。不同的是委托不是独立存在,而是包含在视图里面。 模型视图委托设计模式中&…

步进电机驱动调试问题

工作中,调试24-byj48步进电机遇到一个怪现象: 1. 偶现 2. 出现问题时其中一个马达反转无法驱动,正转正常。 排查思路: 1. 将两个电机交叉验证,发现始终跟M2接口有关。排除电机问题。 2. 检查电机IO口配置&#xf…

大数据项目——广告数仓之HTTP概述

目录 第一章、理解URL 1.1 客户端、服务器 1.1.1 服务器与服务 1.1.2 客户端 1.2 URL 1.3 查询参数 第一章、理解URL 1.1 客户端、服务器 1.1.1 服务器与服务 所谓服务器,其实就是一台24小时不关机的计算机,它也有自己的cpu、内存、网卡、…

Docker更新镜像源小记

Docker镜像源无法访问 进入docker目录 cd /etc/docker/编辑daemon.json文件,如果没有,则新建 {"registry-mirrors": ["https://dockerproxy.cn"] }收集一些镜像源地址,未测是否能用 “https://hub.uuuadc.top”,“htt…

Android 埋点信息分析——内存篇

源码基于:Android U 0. 前言 在前一篇《Android statsd 埋点简析》一文中简单剖析了Android 埋点采集、传输的框架,本文在其基础对埋点信息进行解析,来看下Android 中埋下的内存信息有哪些。 1. 通过代码剖析google 埋点内容 1.1 PROCESS_M…

网络安全之sql靶场(11-23)

sql靶场(11-23) 目录 第十一关(post注入) 第十二关 第十三关 第十四关 第十五关 第十六关 第十七关 第十八关 第十九关 第二十关 第二十一关 第二十二关 第二十三关 第十一关(post注入) 查看…

echart 制作 Grafana 面板之仪表盘

目录 前言准备工作实现代码代码详解总结相关阅读 前言 Grafana 是一个开源的可视化监控工具,支持多种数据源,并且可以创建丰富的仪表盘。ECharts 是一个强大的开源数据可视化库,通过结合这两者,我们可以创建自定义的仪表盘&…

GPIO输出控制之LED闪烁、LED流水灯以及蜂鸣器应用案例

系列文章目录 STM32之GPIO(General Purpose Input/Output,通用型输入输出) 文章目录 系列文章目录前言一、LED和蜂鸣器简介1.1 LED1.2 蜂鸣器1.3 面包板 二、LED硬件电路2.1 低电平驱动电路2.2 高电平驱动电路 三、蜂鸣器硬件电路3.1 PNP型三…