MySQL:数据类型

news2024/12/23 9:26:39

数据类型

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

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

相关文章

【论文阅读】-- 研究时间序列可视化,提升用户体验

Investigating Time Series Visualisations to Improve the User Experience 摘要1 引言2 相关工作互动技巧视觉编码坐标系 3 用户研究时间序列可视化互动技巧任务实验设计 4 结果交互技术的效果视觉编码的影响坐标系的影响 5 讨论交互技术的效果视觉编码的影响坐标系的影响 6 …

(必看图文)Hadoop集群安装及MapReduce应用(手把手详解版)

前言 随着大数据时代的到来,处理和分析海量数据已成为企业和科研机构不可或缺的能力。Hadoop,作为开源的分布式计算平台,因其强大的数据处理能力和良好的可扩展性,成为大数据处理领域的佼佼者。本图文教程旨在帮助读者理解Hadoop集…

《昇思25天学习打卡营第5天|数据变换 Transforms》

文章目录 前言:今日所学:1. Common Transforms2. Vision Transforms3. Text Transforms 前言: 我们知道在进行神经网络训练的时候,通常要将原始数据进行一系列的数据预处理操作才会进行训练,所以MindSpore提供了不同类…

C语言部分复习笔记

1. 指针和数组 数组指针 和 指针数组 int* p1[10]; // 指针数组int (*p2)[10]; // 数组指针 因为 [] 的优先级比 * 高,p先和 [] 结合说明p是一个数组,p先和*结合说明p是一个指针 括号保证p先和*结合,说明p是一个指针变量,然后指…

蒂升电梯职业性格和Verify认知能力SHL测评答题攻略及薪资待遇解密!

​一、蒂升电梯职业性格和认知能力测评考什么 您好!蒂升电梯公司邀请您参加的OPQ职业性格测评和Verify认知能力测评是两种常见的评估工具,用于帮助了解个人的职场性格特点和认知能力。 OPQ职业性格测评 这是一种性格测试,通常用于评估个人在…

一文讲解Docker入门到精通

一、引入 1、什么是虚拟化 在计算机中,虚拟化(英语:Virtualization)是一种资源管理技术,它允许在一台物理机上创建多个独立的虚拟环境,这些环境被称为虚拟机(VM)。每个虚拟机都可以…

盘古5.0,靠什么去解最难的题?

文|周效敬 编|王一粟 当大模型的竞争开始拼落地,商业化在B端和C端都展开了自由生长。 在B端,借助云计算向千行万业扎根;在C端,通过软件App和智能终端快速迭代。 在华为,这家曾经以通信行业起…

Java登录管理功能的自我理解(尚庭公寓)

登录管理 背景知识 1. 认证方案概述 有两种常见的认证方案,分别是基于Session的认证和基于Token的认证,下面逐一进行介绍 基于Session 基于Session的认证流程如下图所示 该方案的特点 登录用户信息保存在服务端内存(Session对象&#xff…

Django 一对多关系

1,创建 Django 应用 Test/app9 django-admin startapp app9 2,注册应用 Test/Test/settings.py 3,添加应用路由 Test/Test/urls.py from django.contrib import admin from django.urls import path, includeurlpatterns [path(admin/,…

安装KB5039212更新卡在25% 或者 96% 进度

系统之家7月1日消息,微软在6月11日的补丁星期二活动中,为Windows 11系统推出了KB5039212更新。然而,部分用户在Windows社区中反映,安装过程中出现失败,进度条在25%或96%时卡住。对于遇到此类问题的Windows 11用户&…

YOLOv8改进 | 主干网络 | C2f融合动态卷积模块ODConv

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有40篇内容,内含各种Head检测头、损失函数Loss、…

Linux CentOS 7 离线安装.NET环境

下载 下载.NET 例如: aspnetcore-runtime-6.0.15-linux-x64.tar.gz 复制 复制到如下目录: /usr/local/dotnet/aspnetcore-runtime-6.0.15-linux-x64.tar.gz 解压 cd /usr/local/dotnet/ tar -zxvf aspnetcore-runtime-6.0.15-linux-x64.tar.gz 创建…

非标设备行业的数智化项目管理

近年来,中国制造快速发展,企业迫切需要加快转型升级。与传统制造业相比,高端制造业具有明显的优势:高技术、高附加值、低污染、低排放、竞争优势强。一方面,企业对于生产效率和自动化水平的要求不断提高,期…

esp12实现的网络时钟校准

网络时间的获取是通过向第三方服务器发送GET请求获取并解析出来的。 在本篇博客中,网络时间的获取是一种自动的行为,当系统成功连接WiFi获取到网络天气后,系统将自动获取并解析得到时间和日期,为了减少误差每两分钟左右进行一次校…

qt可点击的QLabel

需求——问题与思路 使用wpf实现一个可点击的超链接label相当简单(如下图),但是qt的QLabel不会响应点击事件,那就从QLabel继承一个类,然后在该类中重写mousePressEvent函数,并在该函数中对左键点击事件做响…

人工智能——常用数学基础之线代中的矩阵

1. 矩阵的本质: 矩阵本质上是一种数学结构,它由按照特定规则排列的数字组成,通常被表示为一个二维数组。矩阵可以用于描述一组数据,或者表示某种关系,比如线性变换。 在人工智能中,矩阵常被用来表示数据集…

沉浸感拉满的三模游戏外设神器!谷粒金刚3 Pro游戏手柄开箱试玩

沉浸感拉满的三模游戏外设神器!谷粒金刚3 Pro游戏手柄开箱试玩 哈喽小伙伴们好,我是Stark-C~ 对于喜欢打游戏的玩家来说,一款得力的游戏外设绝对是提升游戏体验,增加游戏乐趣的重要神器!而在众多的外设中&#xff0c…

全同态加密在大模型应用中应用

密码学简介 上文的图例基本展示了常见加密体系。加密体系,如果用比较正式的描述方法,无疑是做了三件事: 首先,通过一个生成算法 𝐾𝑒𝑦𝐺𝑒𝑛(1&#x1d70…

32.哀家要长脑子了!

1.299. 猜数字游戏 - 力扣(LeetCode) 公牛还是挺好数的,奶牛。。。妈呀,一朝打回解放前 抓本质抓本质,有多少位非公牛数可以通过重新排列转换公牛数字,意思就是,当这个数不是公牛数字时&#x…

ctfshow web入门 sqli-libs web552--web560

web552 宽字节注入 嗯原理我就不讲了,还是有点复杂后面有时间讲讲 总而言之就是用汉字把\的转义作用抵消了然后正常注入即可 ?id-1包 union select 1,2,3--?id-1包union select 1,(select group_concat(table_name) from information_schema.tables where tab…