MySQL:数据类型

数据类型

  • 1. 字符串类型
  • 2. 整数类型
  • 3. 定点数类型和浮点数类型
  • 4. 布尔类型
  • 5. 枚举和集合类型
  • 6. 日期和时间类型
  • 7. Blob类型
  • 8. JSON类型

在这里插入图片描述
字符串类型、数字类型、日期和时间类型、存放二进制的数据类型、存放地理数据的类型。

1. 字符串类型

字符串类型也可以用来存储邮编,电话号码这样的特殊的数字型文本数据,因为邮编电话号码等不会用来做数学运算而且常常包含‘-’或括号等。

类型含义备注
CHAR()固定长度字符串一般用于固定格式字符串
VARCHAR()可变字符串VARCHAR(50)记录短文本、VARCHAR(255)记录长文本。最多存储64KB, 65535个字符(英文),超过部分会截断
MEDIUMTEXT最大存储16MB适合存储JSON对象、CS视图字符串、中短长度的书
LONGTEXTMax:4GB适合存储书籍和以年记的日志
TINYTEXTMax:255Bytes
TEXTMax:64KB最好用VARCHAR,因VARCHAR可以使用索引

所有这些字符串类型都支持国际字符,其中:

  • 英文字符占1个字节
  • 欧洲和中东语言字符占2个字节
  • 像中日这样的亚洲语言的字符占3个字节

所以,如果一列数据的类型为 CHAR(10),MySQL会预留30字节给那一列的值。

2. 整数类型

bit(1)-B(8);B(1)-KB(1024)-MB(1204KB)-GB(1024MB)-TB(1024GB)
K=1024=2的10次方, M=1024K=2的20次方

整数类型占用储存记录数字范围
TINYINT1B[-128, 127]
UNSIGNED TINYINT1B[0, 255]
SMALLINT2B[-32K, 32K]
MEDIUMINT3B[-8M, 8M]
INT4B[-2B, 2B]
BIGINT8B[-9Z, 9Z]

3. 定点数类型和浮点数类型

类型名称占用存储意义
定点数DECIMAL(x,x)DEC/NUMERIC/FIXED根据需求分配DECIMAL(9,2),共9位,小数点2位,整数部分最多7位
浮点数FLOAT4B单精度浮点数,科学计数法
浮点数DOUBLE8B双精度浮点数,科学计数法
  • 如果需要记录精确数字,比如【货币金额】,就是用 DECIMAL 类型
  • 如果要进行【科学计算】,要处理很大或很小的数据,而且精确值不重要的话,就用 FLOAT 或 DOUBLE。

4. 布尔类型

TRUE/FALSE对应整数1/0

5. 枚举和集合类型

希望某个字段从固定的一系列值中取值,我们就可以用到 ENUM() 和 SET() 类型,前者是取一个值,后者是取多个值。

  1. ENUM()从固定一系列值中取一个值.
    案例:sql_store.products(产品表)里多一个size(尺码)字段,取值为 small/medium/large 中的一个,可以打开产品表的设计模式,添加size列,数据类型设置为 ENUM(‘small’,‘medium’,‘large’),然后apply。
ALTER TABLE `sql_store`.`products`
ADD COLUMN `size` ENUM('small', 'medium', 'large') NULL AFTER `unit_price`;
  1. SET():从固定一系列值中取多个值而非一个值。

Note: 讲解 ENUM 和 SET 只是为了眼熟,最好不要用这两个数据类型,问题很多:

  1. 修改可选的值(如想增加一个’extra large’)会重建整个表,耗费资源;
  2. 想查询可选值的列表或者想用可选值当作一个下拉列表都会比较麻烦;
  3. 难以在其它表里复用,其它地方要用只有重建相同的列,之后想修改就要多处修改,又会很麻烦。

解决方法:像这种某个字段从固定的一系列值中取值的情况,不应该使用 ENUM 和 SET 而应该用这一系列的值另外建一个“查询表” (lookup table)。应 该 另 外 建 一 个 size 尺 码 表 , 就 像 sql_invoicing 里 为 支 付 方 式 专 门 建 了 一 个payment_methods 表一样。这样就解决了上面的所有问题,既方便查询可选值的列表和作为下拉选项,也方便复用和更改。

6. 日期和时间类型

类型含义备注
DATE有日期没时间
TIME有时间没日期
YEAR存储四位的年份
DATETIME包含日期和时间8B
TIMESTAMP时间戳,常用来记录一行数据的插入和最后更新时间占4B,最晚记录2038,称为“2038问题”

7. Blob类型

Blob 类型来储存大的二进制数据,包括PDF,图像,视频等等几乎所有的二进制的文件。通常应该将二进制文件存放在数据库之外,关系型数据库是设计来专门处理结构化关系型数据而非二进制文件的。如果将文件储存在数据库内,会有如下问题:数据库的大小将迅速增长、备份会很慢、性能问题和需要额外的读写图像的代码。

类型含义
TINYBOLB255B
BLOB65KB
MEDIUMBIOB16MB
LONGBIOB4GB

尽量别用数据库来存文件,除非这样做确实有必要而且上面这些问题都已经考虑过了。

8. JSON类型

MySQL还可以储存 JSON 文件,JSON 是 JavaScript Object Notation(JavaScript 对象标记法)的简称。简单讲,JSON 是一种在互联网上储存和传播数据的简便格式,JSON 在网络和移动应用中被大量使用,多数时候你的手机应用会以 JSON 形式向后端传输数据。
语法结构:

{
"key": value
}

1 . JSON 用大括号 {} 表示一个对象,里面有多对键值对
2. 键 key 必须用引号包裹(而且必须是双引号,不能用单引号)
3. 值 value 可以是数值,布林值,数组,文本, 甚至另一个对象(形成嵌套 JSON 对象)

案例:
注意这里每件产品的独特属性的种类是不一样的,如衣服是颜色和尺码,而电视机是的重量和尺寸,把所有可能的属性都作为不同的列添加进表是很糟糕的设计,因为每个商品都只能用到所有这些属性的一部分,相反,通过增加一列 JSON 类型的 properties 列,我们可以利用 JSON 里的键值对很方便的储存每个商品独特的属性。


  1. 添加一列属性,设置数据类型为JSON,默认值为NULL。
    方法1:采用JSON的标准格式:
UPDATE products
SET properties = '
{"dimensions":[1,2,3],"weight":10,"manufacturer":{"name":"sony"}
}'
WHERE product_id = 1;

方法2:采用针对JSON的内置函数

UPDATE products
SET properties = JSON_OBJECT('weight',  10,'dimensions',  JSON_ARRAY(1,2,3),'manufacturer', JSON_OBJECT('name','sony')
)
WHERE product_id = 1;

  1. 查询 JSON 对象里的特定键值对,这是将一列设为 JSON 对象的优势所在,如果 properties 列是字符串类型如 VARCHAR 等,是很难获取特定的键值对的。
    方法1:采用JSON_EXTRACT()函数,其中第一个参数指明JSON对象,第二个参数用单引号包裹的路径,路径中$表示当前对象,点操作符.表示对象的属性
SELECT product_id, JSON_EXTRACT(properties, '$.weight') AS weight
FROM products
WHERE product_id = 1;

方法2:使用列路径操作符 -> 和 ->>,后者可以去掉结果外层的引号

SELECT product_id, properties -> '$.weight' AS weight,properties -> '$.dimensions' AS dimension,properties -> '$.dimensions[0]' AS dimension_length,-- JSON对象的索引从0开始,MySQL的字符串索引从1开始properties -> '$.manufacturer.name' AS manufacturer,properties ->>'$.manufacturer.name' AS manufacturer-- 用->> 来消除结果显示中的引号
FROM products
WHERE product_id = 1;
  • Note: 通过路径操作符来获取 JSON 对象的特定属性不仅可以用在 SELECT 选择语句中,也可以用在 WHERE 筛选语句中.

  1. 如果我们是要重新设置整个JSON对象就用前面增里讲到的JSON_OBJECT()函数,但如果是想修改已有JSON对象里的部分属性,就要用JSON_SET()函数。
    同样可以采用重新定义来更改其中的数据。
UPDATE products
SET properties = JSON_SET(properties,'$.weight', 20,'$.age', 10  -- 增加age属性
)
WHERE product_id = 1;
  • 语法规则:JSON_SET()函数的第一个参数为需要修改的属性列

  1. 可以用JSON_REMOVE()函数实现对已有JSON对象特性属性的删除,原理和JSON_SET()一样。
UPDATE products
SET properties = JSON_REMOVE(properties,'$.weight','$.age'  -- 删除age属性
)
WHERE product_id = 1;

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

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

相关文章

Windows server 由于没有远程桌面授权服务器可以提供许可证,远程会话连接已断开。

问题现象: 解决办法 临时远程方式1: 打开 mstsc 时带上 /admin 等参数,如下图所示: 使用“mstsc /admin /v:目标ip”来强制登录服务器,但只能是管理员身份。 远程方式2: 通过VM远程登陆系统后,运行输入R…

【第七节】C/C++排序算法

目录 前言 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 七、 堆排序 八、计数排序 九、桶排序 十、基数排序 前言 排序算法可以大致分为两大类:比较类排序和非比较类排序。以下是这两大类中一些常见的排序算法示例&…

dledger原理源码分析系列(一)-架构,核心组件和rpc组件

简介 dledger是openmessaging的一个组件, raft算法实现,用于分布式日志,本系列分析dledger如何实现raft概念,以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的架构,核心组件;rpc组…

高等数学在Android开发中的应用:函数极限与算法优化

高等数学在Android开发中的应用:函数极限与算法优化 在Android开发中,高等数学中的许多概念和技术都能够显著提高应用程序的性能和功能。这篇博客将探讨一些具体的数学原理,特别是函数极限在Android中的实际应用。 函数极限的基本概念 函数极限是微积分的基础,广泛应用于…

6.The hardest part about learing hard things(学一件难的事,难在哪里)

I’ve been recording a lot of podcast interviews for my upcoming book, Ultralearning.One of the reurring themes I’ve noticed in our conversations is that how people feel about learning is the overwhelming cause of the results they experience. 我为我的新书…

最新AIGC系统源码-ChatGPT商业版系统源码,自定义ChatGPT指令Promp提示词,AI绘画系统,AI换脸、多模态识图理解文档分析

目录 一、前言 系统文档 二、系统演示 核心AI能力 系统快速体验 三、系统功能模块 3.1 AI全模型支持/插件系统 AI模型提问 文档分析 ​识图理解能力 3.2 GPts应用 3.2.1 GPTs应用 3.2.2 GPTs工作台 3.2.3 自定义创建Promp指令预设应用 3.3 AI专业绘画 3.3.1 文…

基于OpenCV与Keras的停车场车位自动识别系统

本项目旨在利用计算机视觉技术和深度学习算法,实现对停车场车位状态的实时自动识别。通过摄像头监控停车场内部,系统能够高效准确地辨认车位是否被占用,为车主提供实时的空闲车位信息,同时为停车场管理者提供智能化的车位管理工具…

谷歌GenType:1分钟生成AI艺术字母表,小众但好用,完全免费!(附教程)

文章首发于公众号:X小鹿AI副业 大家好,我是程序员X小鹿,前互联网大厂程序员,自由职业2年,也一名 AIGC 爱好者,持续分享更多前沿的「AI 工具」和「AI副业玩法」,欢迎一起交流~ 最近发现一个好玩的…

linux 控制台非常好用的 PS1 设置

直接上代码 IP$(/sbin/ifconfig eth0 | awk /inet / {print $2}) export PS1"\[\e[35m\]^o^\[\e[0m\]$ \[\e[31m\]\t\[\e[0m\] [\[\e[36m\]\w\[\e[0m\]] \[\e[32m\]\u\[\e[0m\]\[\e[33m\]\[\e[0m\]\[\e[34m\]\h(\[\e[31m\]$IP\[\e[m\])\[\e[0m\]\n\[\e[35m\].O.\[\e[0m\]…

云计算【第一阶段(23)】Linux系统安全及应用

一、账号安全控制 1.1、账号安全基本措施 1.1.1、系统账号清理 将非登录用户的shell设为/sbin/nologin锁定长期不使用的账号删除无用的账号 1.1.1.1、实验1 用于匹配以/sbin/nologin结尾的字符串,$ 表示行的末尾。 (一般是程序用户改为nologin&…

将exe文件添加到注册表中,实现开机时自动运行

目录 一、前言 二、代码 三、使用步骤 1.编译生成exe文件、 2.以管理员身份运行代码 3.打开注册表,验证结果 一、前言 在Windows操作系统中,将exe文件的路径添加到注册表下,主要用于实现程序的开机自动运行功能。 注册表路径为&#xf…

nlp--最大匹配分词(计算召回率)

最大匹配算法是一种常见的中文分词算法,其核心思想是从左向右取词,以词典中最长的词为优先匹配。这里我将为你展示一个简单的最大匹配分词算法的实现,并结合输入任意句子、显示分词结果以及计算分词召回率。 代码 : # happy coding…

3个企业级最佳实践,教你ByteHouse云数仓这么用

随着各业务场景各行业数字化转型加快,数据量呈爆炸式增长。在拥有庞大数据的同时,业务也在分析、查询与响应层面,对数据库系统性能提出了更高要求。云原生技术推动了分布式数据库系统的迭代升级,对云数仓技术而言,“写…

猫头虎博主全栈前沿AI技术领域矩阵社群

猫头虎博主全栈前沿AI技术领域矩阵社群 👋大家好,我是猫头虎!今天我要向大家介绍一个非常重要的社群矩阵——专为全栈前沿AI技术领域的朋友们打造的各种技术交流和资源互助的社群。这些社群不仅能帮助大家快速提升技术水平,还能拓…

科普文:一文搞懂jvm实战(二)Cleaner回收jvm资源

概叙 在JDK9中新增了Cleaner类,该类的作用是用于替代finalize方法,更有效地释放资源并避免内存泄漏。 在JEP260提案中,封装了大部分Sun包内部的API之余,还引入了一些新的API,其中就包含着Cleaner这个工具类。Cleaner承…

Golang | Leetcode Golang题解之第204题计数质数

题目&#xff1a; 题解&#xff1a; func countPrimes(n int) int {primes : []int{}isPrime : make([]bool, n)for i : range isPrime {isPrime[i] true}for i : 2; i < n; i {if isPrime[i] {primes append(primes, i)}for _, p : range primes {if i*p > n {break}…

排序算法(1)之插入排序----直接插入排序和希尔排序

个人主页&#xff1a;C忠实粉丝 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 C忠实粉丝 原创 排序之插入排序----直接插入排序和希尔排序(1) 收录于专栏【数据结构初阶】 本专栏旨在分享学习数据结构学习的一点学习笔记&#xff0c;欢迎大家在评论区交流讨…

密码学基础之ASN.1编码

简介 ASN.1(Abstract Syntax Notation One)&#xff0c;抽象语法标记。ASN.1是一种国际标准的正式语言&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;和国际电信联盟&#xff08;ITU-T&#xff09;共同制定&#xff0c;用于定义数据结构的抽象语法。它的设计目标是…

双端队列广搜——AcWing 175. 电路维修

双端队列广搜 定义 双端队列广搜&#xff08;Breadth-First Search with a Deque&#xff09;是一种图或树的遍历算法变体&#xff0c;它利用了双端队列&#xff08;Deque&#xff0c;全称Double Ended Queue&#xff0c;允许在其两端进行插入和删除操作&#xff09;作为数据…

docker-compose搭建minio对象存储服务器

docker-compose搭建minio对象存储服务器 最近想使用oss对象存储进行用户图片上传的管理&#xff0c;了解了一下例如aliyun或者腾讯云的oss对象存储服务&#xff0c;但是呢涉及到对象存储以及经费有限的缘故&#xff0c;决定自己手动搭建一个oss对象存储服务器&#xff1b; 首先…