【MySQL】MySQL数据类型
文章目录
- 一、数据类型的分类
- 二、tinyint类型
- 2.1 创建有符号数值
- 2.2 创建无符号数值
- 三、bit类型
- 三、浮点类型
- 3.1 float
- 3.2 decimal类型
- 四、字符串类型
- 4.1 char类型
- 4.2 varchar类型
- 五、日期和时间类型
- 六、枚举和集合类型
- 6.1 enum的枚举值和set的位图结构
- 6.2 查询集合find_in_set
一、数据类型的分类

- 数值类型

二、tinyint类型
2.1 创建有符号数值
默认是有符号的。取值范围[-128,127]:
mysql> create table if not exists t1(-> num tinyint-> );

插入tinyint类型数值范围内的数据是可以的:
mysql> insert into t1 values (-128);
Query OK, 1 row affected (0.01 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> insert into t1 values (-129);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
2.2 创建无符号数值
用tinyint unsigned数据类型创建表t2:
mysql> create table if not exists t2( num tinyint unsigned );
Query OK, 0 rows affected (0.02 sec)
我们知道tinyint unsigned类型的范围是【0 ~ 255】:
mysql> insert into t2 values (0);
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 (-1);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> insert into t2 values (256);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
如果我们向MySQL特定的类型中插入不合法的数据,MySQL一般都是直接拦截,不让我们做对应的操作!
反过来,我们如果已经有数据被插入到MySql中了,那么一定是合法的。
所以数据类型本身就是一种约束。
MySql表中建立属性列:列名称 类型在后
num tinyint unsigned;
三、bit类型
bit[(M)] :位字段类型。M表示有几位,范围从1到64位。如果M被忽略,默认为1。
mysql> create table if not exists t3( -> num1 bit(1),-> num2 bit(64)-> );
Query OK, 0 rows affected (0.03 sec)
对于num1只能插入0或1。
mysql> insert into t3 (num1, num2) values (1, 256);
Query OK, 1 row affected (0.01 sec)mysql> insert into t3 (num1, num2) values (0, 1024);
Query OK, 1 row affected (0.01 sec)
位类型显示的是ASCII码,如果想看到:可以使用十六进制打印。
select hex(num1),hex(num2) from t3;

验证一下:
如果插入’a’或者97:
mysql> insert into t3 (num1, num2) values(1, 97);
Query OK, 1 row affected (0.01 sec)mysql> insert into t3 (num1, num2) values(1, 'a');
Query OK, 1 row affected (0.00 sec)

所以bit字段在显示时,是按照ASCII码对应的值显示。
三、浮点类型
3.1 float
float[(m, d)] [unsigned] : M指定显示长度,d指定小数位数,占用空间4个字节
例如:
float(5,2) 表示的范围是 -999.99 ~ 999.99
float(5,2) unsigned 表示的范围 0 ~ 999.99
创建表:
mysql> create table if not exists t5(-> num float(4, 3)-> );
Query OK, 0 rows affected (0.04 sec)
插入数据:
mysql> insert into t5 (num) values (9.999);
Query OK, 1 row affected (0.00 sec)mysql> insert into t5 values (-9.999);
Query OK, 1 row affected (0.00 sec)

插入的如果是 1.2345,会变成1.234(超过5进1)
mysql> insert into t5 values (1.2345);
Query OK, 1 row affected (0.01 sec)mysql> insert into t5 values (1.2346);
Query OK, 1 row affected (0.01 sec)

但是如果进位以后超过范围了就也无法插入成功。
mysql> insert into t5 values (9.9996);
ERROR 1264 (22003): Out of range value for column 'num' at row 1
如果是无符号浮点数就不能插入负数了,上限不变。
3.2 decimal类型
decimal(m, d) [unsigned] : M指定显示的总长度(整数+小数),d指定小数位数。
decimal和float很像,表示的数据范围一样,但是精度不一样。
创建表:
mysql> create table t7(-> num1 float(10, 8),-> num2 decimal(10, 8)-> );
Query OK, 0 rows affected (0.03 sec)
插入数据:
mysql> insert into t7 (num1, num2) values (10.0, 99.99);
Query OK, 1 row affected (0.01 sec)mysql> insert into t7 (num1, num2) values (23.12345612, 23.12345612);
Query OK, 1 row affected (0.00 sec)

可以看到float类型存在精度丢失,decimal存什么就是什么。(精度高)
float在精度过大会做一些动作,而decimal不会。
float表示的精度大约是7位。decimal整数最大位数m为65。支持小数最大位数d是30。如果d被省略,默认为0.如果m被省略,默认是10。
建议:如果希望小数的精度高,推荐使用decimal或double而不是float。
四、字符串类型
4.1 char类型
char(L): 固定长度字符串,L是可以存储的长度,单位为字符(注意是字符,不是字节),最大长度值可以为255
创建表:
mysql> create table t6(-> num char(2)-> );
Query OK, 0 rows affected (0.06 sec)
插入数据:
mysql> insert into t6 values ('a');
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values ('ab');
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values ('abc');
ERROR 1406 (22001): Data too long for column 'num' at row 1
如果插入汉字:对于gbk编码一个占用2个字节,utf8编码一个汉字占用3个字节
mysql> insert into t6 values ('哈');
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values ('哈哈');
Query OK, 1 row affected (0.00 sec)mysql> insert into t6 values ('哈哈哈');
ERROR 1406 (22001): Data too long for column 'num' at row 1
mysql的字符代表的是符号,所以能够插入成功。

4.2 varchar类型
varchar(L): 可变长度字符串,L表示字符长度,最大长度65535个字节
关于varchar(L),L到底是多大,这个len值,和表的编码密切相关:
varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是65532。(如果表中仅有一个varchar字段,有效字节数是65532,如果还有其他的字段,那么varchar的实际有效字节将会比65532低一点)
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
创建表:
mysql> create table t4(-> id int,-> name varchar(6)-> );
Query OK, 0 rows affected (0.03 sec)
插入数据跟char类型是一样的。
char和varchar的区别:
char是固定长度字符串,类似C/C++中的数组的概念,例如char(6)表示开辟6个字符的大小的空间,没用完就是浪费。
varchar是可变长度的字符串,例如varchar(6)表示最大长度为6个字符,如果用户仅使用了一个字符,那么varchar只会分配出一个字符的空间+额外1个字节(记录数据大小)用于存储。
五、日期和时间类型
常用的日期有如下三个:
date:日期 ‘yyyy-mm-dd’ ,占用三字节
datetime时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从 1000 到 9999 ,占用八字节
timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字节
创建表:
mysql> create table t8(-> t1 date,-> t2 datetime,-> t3 timestamp-> );
Query OK, 0 rows affected (0.04 sec)

对于时间戳timestamp:创建表结构,插入数据是tinmestamp会自动更新。所以不需要更改
mysql> insert into t8 (t1, t2) values ('2002-07-31', '2023-07-31 08:00:00');
Query OK, 1 row affected (0.00 sec)

此时更新t1:
mysql> update t8 set t1='2003-07-31';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from t8;
+------------+---------------------+---------------------+
| t1 | t2 | t3 |
+------------+---------------------+---------------------+
| 2003-07-31 | 2023-07-31 08:00:00 | 2023-08-03 17:17:45 |
+------------+---------------------+---------------------+
1 row in set (0.00 sec)
t1和t3都会被更新,这也说明了时间戳timestamp会自动更新,意义在于记住时间的更新。
六、枚举和集合类型
6.1 enum的枚举值和set的位图结构
创建带有enum和set类型的表votes:
mysql> create table if not exists votes(-> username varchar(10),-> gander enum('男', '女'),-> hobby set('篮球', '足球', '跑步')-> );
插入数据:
mysql> insert into votes values ('张三', '男', '跑步');
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values ('李四', '女', '篮球');
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values ('赵五', 'a', '篮球');
ERROR 1265 (01000): Data truncated for column 'gander' at row 1
可以看到对于gander我们只能插入男或者女,不能插入其他字符。
但是可以插入1和2,也就是说枚举类型可以写常量也可以写常量的下标。
对于set也可输入数字插入,数字代表位图:
mysql> insert into votes values ('赵五', '男', '羽毛球');
ERROR 1265 (01000): Data truncated for column 'hobby' at row 1mysql> insert into votes values ('赵五', '男', '跑步,篮球')
Query OK, 1 row affected (0.01 sec)mysql> insert into votes values ('赵五', '男', '跑步,篮球,足球');
Query OK, 1 row affected (0.01 sec)

mysql> insert into votes (username) values ('小明');
Query OK, 1 row affected (0.02 sec)mysql> insert into votes values ('小明', 1, 0);
Query OK, 1 row affected (0.00 sec)mysql> insert into votes values ('小明', 1, 1);
Query OK, 1 row affected (0.00 sec)

NULL表示什么都没有,而' '表示有东西但是是一个空串。
当然set是一个位图结构,如果是3,那么就是1 | 2(篮球,足球)。
enum:在所有枚举中选择一种进行插入。也可以直接使用枚举值,枚举值从1开始。
set:在集合中选择一种或多种存在的选项进行数据的插入。也可使用位图的形式进行数据插入。
6.2 查询集合find_in_set
如果我们想要查询爱好是篮球的:
mysql> select * from votes where hobby='篮球';
+----------+--------+--------+
| username | gander | hobby |
+----------+--------+--------+
| 李四 | 女 | 篮球 |
| 小明 | 男 | 篮球 |
+----------+--------+--------+
2 rows in set (0.00 sec)
可以看到是精确筛选
下面介绍一个函数find_in_set:
mysql> select find_in_set('a', 'a,b,c');
+---------------------------+
| find_in_set('a', 'a,b,c') |
+---------------------------+
| 1 |
+---------------------------+
1 row in set (0.00 sec)
这里的1表示true,说明’a’在集合’a,b,c’中。
这里只能查找一个元素是否在对应的集合中。
mysql> select find_in_set('d', 'a,b,c');
+---------------------------+
| find_in_set('d', 'a,b,c') |
+---------------------------+
| 0 |
+---------------------------+
1 row in set (0.00 sec)mysql> select find_in_set('a,b', 'a,b,c');
+-----------------------------+
| find_in_set('a,b', 'a,b,c') |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set (0.00 sec)
当一个要查找的字段位于集合中时,find_in_set函数会返回其下标(非0),反之返回0。所以我们就可以在集合中筛选出爱好带有“篮球”的人。
mysql> select * from votes where find_in_set ('篮球', hobby);
+----------+--------+----------------------+
| username | gander | hobby |
+----------+--------+----------------------+
| 李四 | 女 | 篮球 |
| 赵五 | 男 | 篮球,跑步 |
| 赵五 | 男 | 篮球,足球,跑步 |
| 小明 | 男 | 篮球 |
| 小明 | 男 | 篮球,足球 |
+----------+--------+----------------------+
5 rows in set (0.00 sec)
也可以在集合中筛选出爱好既有“篮球”,又有“足球”人。使用and逻辑与进行筛选:
mysql> select * from votes where find_in_set ('篮球', hobby) and find_in_set('足球', hobby);
+----------+--------+----------------------+
| username | gander | hobby |
+----------+--------+----------------------+
| 赵五 | 男 | 篮球,足球,跑步 |
| 小明 | 男 | 篮球,足球 |
+----------+--------+----------------------+
2 rows in set (0.00 sec)
相关文章:
【MySQL】MySQL数据类型
文章目录 一、数据类型的分类二、tinyint类型2.1 创建有符号数值2.2 创建无符号数值 三、bit类型三、浮点类型3.1 float3.2 decimal类型 四、字符串类型4.1 char类型4.2 varchar类型 五、日期和时间类型六、枚举和集合类型6.1 enum的枚举值和set的位图结构6.2 查询集合find_in_…...
【数据结构与算法】十大经典排序算法-希尔排序
🌟个人博客:www.hellocode.top 🏰Java知识导航:Java-Navigate 🔥CSDN:HelloCode. 🌞知乎:HelloCode 🌴掘金:HelloCode ⚡如有问题,欢迎指正&#…...
docker 常用命令
1. 搜索并下载镜像 docker search bundlefusion # 搜索docker pull jhljx/bundlefusion # 将远程仓库文件下载到本地2. 用镜像创建容器 docker run -it --namebundlefusion colec777/bundlefusion-cu11.4-cudagl:v8 /bin/bash # 创建并运行 exit # 退出终端 sudo docker cont…...
uniapp微信小程序中打开腾讯地图获取用户位置信息
实现的效果 第一步:首先登录微信公众平台 , 需要用到AppID 第二步: 注册登录腾讯位置服务 注册需要手机号和邮箱确认,然后创建应用 创建后点击添加key 添加后会生成key,后面会用到这个key 第三步: 登录微信公众平台&a…...
嵌入式领域:人才供需失衡,发展潜力巨大
嵌入式技术正快速发展,ARM处理器、嵌入式操作系统、LINUX等技术助力嵌入式领域崛起。然而,行业新颖且门槛高,缺乏专业指导。因此,嵌入式人才稀缺,身价水涨船高。 未来几年,嵌入式系统将在信息化、智能化、…...
python 书籍
python高手进阶之路 10册 QQ:417398600...
Debian纯净系统安装php常用扩展和程序
适用于 php-fpm debian容器 mysql扩展 docker-php-ext-install pdo_mysql docker-php-ext-install mysqliredis扩展 pecl install redis docker-php-ext-enable redis# pecl无法装就: docker-php-source extract # 创建并初始化 /usr/src/php目录(扩展…...
vue+element中如何设置单个el-date-picker开始时间和结束时间关联
功能:选了开始时间,则结束时间只能选择开始时间之后的;选了结束时间,则开始时间只能选择结束时间之前的 重点是picker-options属性 图示: 代码展示: // body 内部<el-form-item><el-date-pickerv-model&qu…...
二次封装ajax和axios
ajax app.config.globalProperties.$http function(url, method, data, async, fun) {$.ajax({url: baseUrl url, //请求地址type: method, //请求方式dataType: json, //数据类型contentType: "application/json",xhrFields: { //跨域设置withCredentials: t…...
Android进阶之SeekBar动态显示进度
SeekBar 在开发中并不陌生,默认的SeekBar是不显示进度的,当然用吐司或者文案在旁边实时显示也是可以的,那能不能移动的时候才显示,默认不显示呢,当然网上花哨的三方工具类太多了,但是我只是单纯的想在SeekBar的基础上去添加一个可以跟随移动显示的气泡而…...
企业计算机服务器中了locked勒索病毒怎么办,如何预防勒索病毒攻击
计算机服务器是企业的关键信息基础设备,随着计算机技术的不断发展,企业的计算机服务器也成为了众多勒索者的攻击目标,勒索病毒成为当下计算机服务器的主要攻击目标。近期,我们收到很多企业的求助,企业的服务器被locked…...
大麦订单截图 一键生成订单截图
新版付款图样式展示 这个样式图就是在大麦刚付款完的一个订单截图,它的状态是等待卖家发货 下滑下载源码 下载源码:https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3...
LLaMA长度外推高性价比trick:线性插值法及相关改进源码阅读及相关记录
前言 最近,开源了可商用的llama2,支持长度相比llama1的1024,拓展到了4096长度,然而,相比GPT-4、Claude-2等支持的长度,llama的长度外推显得尤为重要,本文记录了三种网络开源的RoPE改进方式及相…...
中国信息安全测评中心CISP家族认证一览
随着国家对网络安全的重视,中国信息安全测评中心根据国家政策、未来趋势、重点内容陆续增添了很多CISP细分认证。 今日份详细介绍,部分CISP及其子品牌相关认证内容,一定要收藏哟! 校园版CISP NISP国家信息安全水平考试ÿ…...
牛客网【面试必刷TOP101】~ 06 递归/回溯
牛客网【面试必刷TOP101】~ 06 递归/回溯 文章目录 牛客网【面试必刷TOP101】~ 06 递归/回溯[toc]BM55 没有重复项数字的全排列(★★)BM56 有重复项数字的全排列(★★)BM57 岛屿数量(★★)BM58 字符串的排列(★★)BM59 N皇后问题(★★★)BM60 括号生成(★★)BM61 矩阵最长递增路…...
ArcGIS Pro基础:【划分】工具实现等比例、等面积、等宽度划分图形操作
本次介绍【划分】工具的使用,如下所示,为该工具所处位置。使用该工具可以实现对某个图斑的等比例面积划分、相等面积划分和相等宽度划分。 【等比例面积】:其操作如下所示,其中: 1表示先选中待处理的图斑,2…...
括号匹配问题:栈的巧妙应用与代码优化【栈、优化、哈希表】
当解决算法问题时,灵活使用数据结构是至关重要的。在这个问题中,我们需要判断一个只包含括号的字符串是否有效,即括号是否能够正确匹配和闭合。使用栈这一数据结构可以很好地解决这个问题。 题目链接:有效的括号 解题思路…...
vue项目正确使用样式deep穿透
经常开发前端的程序员应该都知道前端一般都是组件化开发,为了避免样式污染通常会使用scoped添加属性选择器,此时如果我们想在父组件中修改子组件的样式便成了难题。其实,我们可以通过以下几种方式修改子组件样式, 组件样式穿透 …...
Jenkins持续集成-快速上手
Jenkins持续集成-快速上手 注:Jenkins一般不单独使用,而是需要依赖代码仓库,构建工具等。 搭配组合:GitGitee(GitHub、GitLab)MavenJenkins 前置准备 常见安装方式: war包Docker容器实例&…...
查看linux 所有运行的应用和端口命令
要查看 Linux 中所有运行的应用程序及其对应的端口,可以使用以下命令: 1. 使用 netstat 命令(已被弃用,建议使用 ss 命令): netstat -tuln 这会显示当前系统上所有打开的网络连接和监听的端口。其中&#…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
C++.OpenGL (10/64)基础光照(Basic Lighting)
基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Selenium常用函数介绍
目录 一,元素定位 1.1 cssSeector 1.2 xpath 二,操作测试对象 三,窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四,弹窗 五,等待 六,导航 七,文件上传 …...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
