12. 数据类型

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 12. 数据类型

字符串类型

数据类型 长度 备注
char(x) 固定长度 x为1到255之间的整数
varchar(x) 可变长度 x为1到65535之间的整数,最多65535个字符,64KB
mediumtext 最长16MB
longtext 最长4GB
tinytext 最长255b
text 最长64KB
注意: 为了维护数据库的一致性,可变长的字符串长度设置最好也能分类。varchar(50) 表示短字符串,varchar(255) 表示中等长度字符串,可以不用经常检查

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

  • 英文字符占1个字节
  • 欧洲和中东语言字符占2个字节
  • 像中日这样的亚洲语言的字符占3个字节 所以,如果一列数据的类型为 CHAR(10),MySQL会预留30字节给那一列的值

整数类型

数据类型 长度 备注
tinyint 1b [-128, 127]
unsigned tinyint 1b [0, 255]
smallint 2b [-32k, 32k]
mediumint 3b [-8M, 8M]
int 4b [-2B, 2B]
注意: 如果试图存入超过范围的数字,MySQL会报错

MySQL 还可以根据 INT 后面的数字来决定显示成什么样子,但是,这并不影响数字在MySQL中的存储

例如:1  int(4) =>  0001

用最小的能满足需求的数据类型,这样数据库大小会更小,查询执行也会更快。

顶点和浮点类型

数据类型 类型 备注
decimal(p, s) 定点数类型 p,s分别表示精度(1~65)和小数位数
dec 定点数类型 同上
numeric 定点数类型 同上
fixed 定点数类型 同上
float 浮点数类型 4b
double 双精度浮点数类型 8b

如果需要记录精确的数字,比如货币金额,就是用 DECIMAL 类型

如果要进行科学计算,要处理很大或很小的数据,而且精确值不重要的话,就用 FLOATDOUBLE

布尔类型

  • bool
  • boolean

枚举和集合类型

ENUM() 从固定一系列值中取一个值

ENUM('small','medium','large') 表示这个类型中的值是括号内元素之一

SET() 和 ENUM() 类似,但是可以存多个值

不建议使用:

  1. 两者的类型不好复用,一旦某个地方修改,所有其他的地方都要修改,不如使用一张关系表,只需要多添加一条查询语句就可以实现
  2. 如果要修改enum类型中的值,会导致重建整张表,如果表中的数据很多,会非常耗费时间。

日期和时间类型

数据类型 大小 作用
date 有日期没时间
time 有时间没日期
datetime 8b 包含日期和时间
timestamp 4b 时间戳,常用来记录一行数据的的插入或最后更新时间
year 专门储存四位的年份

blob类型

Blob 类型来储存大的二进制数据,包括PDF,图像,视频等等几乎所有的二进制的文件

具体来说,MySQL里共有4种 Blob 类型,它们的区别在于可储存的最大文件大小:

数据类型 大小
tinyblob 255b
blob 65KB
mediumblob 16MB
longblob 4GB

一般来说最好不要把文件存在数据库中,因为关系型数据库是为了处理结构化关系型数据库设计的会导致以下问题:

  1. 迅速增加数据库的大小
  2. 弱化数据备份功能
  3. 出现性能问题
  4. 在数据库中读取或者存储图像必须额外写代码

JSON类型

sql

复制代码

update products
set properties = '
{
  "dimensions":[1,2,3],
    "weight":10,
    "manufacturer":{
    "name":"sony"
    }
}
'
where product_id = 1;

上面的语句可以用MySQL内置的函数替换

sql

复制代码

update products
set properties = json_object(
  'weight','10',
    'dimensions',json_array(1,2,3),
    'manufacturer',json_object('name','sony')
)
where product_id = 1;

还可以通过已经有的 MySQL 解析函数解析 JSON 格式

sql

复制代码

select product_id,json_extract(properties,'$.weight') as weight
from products
where product_id = 1;

还可以使用 -> 更简洁,后面可以继续通过 点 来调用

sql

复制代码

select product_id,properties -> '$.weight'
from products
where product_id = 1;

但是上面的结果数据都是由引号的,可以使用 ->> 来去掉,只返回值

sql

复制代码

select product_id,properties ->> '$.weight'
from products
where product_id = 1;

在查询语句里面也可以直接使用

sql

复制代码

select product_id,properties ->> '$.weight'
from products
where properties ->> '$.weight' = '10';

更新 json 中的某些值 下面的 json_set 和 json_remove 都是拾取一个 json 对象,修改并返回一个新的 json 对象

我们其实是把这些属性设置到了一个由这个函数返回的新json对象

sql

复制代码

update products
set properties = json_set(
  properties,
    '$.weight', 20,
    '$.age',10
)
where product_id = 1;
update products
set properties = json_remove(
  properties,
    '$.weight', 20,
    '$.age',10
)
where product_id = 1;


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
前端开发 算法 网络安全
图片滑块验证功能很难吗?做个可以自己抠形状的图片滑块验证组件
图片滑块验证功能很难吗?做个可以自己抠形状的图片滑块验证组件
332 0
Echarts组件legend属性显示数据和icon图片自定义的解决方案
Echarts组件legend属性显示数据和icon图片自定义的解决方案
1006 0
|
缓存 应用服务中间件 nginx
Web服务器的缓存机制与内容分发网络(CDN)
【8月更文第28天】随着互联网应用的发展,用户对网站响应速度的要求越来越高。为了提升用户体验,Web服务器通常会采用多种技术手段来优化页面加载速度,其中最重要的两种技术就是缓存机制和内容分发网络(CDN)。本文将深入探讨这两种技术的工作原理及其实现方法,并通过具体的代码示例加以说明。
1010 1
|
运维 Devops Linux
Linux下的DevOps
Linux下的DevOps
|
JavaScript 前端开发 数据库
vue+elementUi实现将数字转化为 对应的字符串内容
该博客文章介绍了如何在Vue框架结合Element UI组件库中,将数字状态字段转换为具体的字符串描述,并通过`el-table-column`展示在表格中。
vue+elementUi实现将数字转化为 对应的字符串内容
|
存储 SQL 关系型数据库
MySQL事务日志奥秘:undo log大揭秘,一文让你彻底解锁!
【8月更文挑战第24天】本文深入探讨了MySQL中undo log的关键作用及其在确保事务原子性和一致性方面的机制。MySQL通过记录事务前的数据状态,在需要时能回滚至初始状态。主要介绍InnoDB存储引擎下的undo log实现,包括undo segment和record的结构,而MyISAM则采用redo log保障持久性而非一致性。通过一个简单的SQL回滚示例,展示了undo log如何在实际操作中发挥作用,帮助读者更好地理解并运用MySQL事务管理功能。
755 0
|
调度 数据库 UED
Python使用asyncio包实现异步编程方式
异步编程是一种编程范式,用于处理程序中需要等待异步操作完成后才能继续执行的情况。 异步编程允许程序在执行耗时的操作时不被阻塞,而是在等待操作完成时继续执行其他任务。 这对于处理诸如文件 I/O、网络请求、定时器等需要等待的操作非常有用。
|
机器学习/深度学习 存储 自然语言处理
使用Python实现深度学习模型:语言翻译与多语种处理
【7月更文挑战第21天】 使用Python实现深度学习模型:语言翻译与多语种处理
580 0
|
存储 Perl
sed处理多行模式(如括号匹配)
sed处理多行模式(如括号匹配)
1348 2
教你把各类证书转成pdf文档,很多平台和评职称都用得上!
最近,是维护“全国教师管理信息系统”的日子,各地平台纷纷呈现出卡顿状态,甚至有的直接崩溃、一片空白。
1020 0