mysql 问题解答
01 Mysql有哪些数据类型
MySQL支持多种数据类型,这些类型可以分为几个大的类别:数值类型、日期和时间类型、字符串(字符和字节)类型、空间类型、JSON类型。下面是每种类型的简要说明和用途,以及示例。
数值类型
-
整型:
TINYINT
:非常小的整数,如性别标识(0代表女性,1代表男性)。SMALLINT
:小型整数,如年龄字段。MEDIUMINT
:中型整数,可能用于存储社区内的用户数量。INT
或INTEGER
:标准整数,适用于存储更大范围的数值,如用户ID。BIGINT
:更大范围的整数,例如存储社交媒体平台的全球用户ID。
每种整型都有相应的
UNSIGNED
属性,可以存储更大的正数值。 -
浮点型和定点型:
FLOAT
:单精度浮点数,如存储商品的价格。DOUBLE
:双精度浮点数,如存储科学数据或精确计算。DECIMAL
或NUMERIC
:用于存储精确的小数,常用于财务计算,例如账户余额。
日期和时间类型
DATE
:包含日期值的列(年月日),例如存储用户的生日。TIME
:包含时间值(时分秒),例如记录事件的持续时间。DATETIME
:包含日期和时间值,用于记录文章发布的具体时间。TIMESTAMP
:包含日期和时间值,通常用于记录数据行的创建和修改时间。YEAR
:年份值,比如表示汽车的制造年份。
字符串类型
-
字符型:
CHAR
:定长字符串,如存储车牌号。VARCHAR
:变长字符串,适用于存储长度不固定的文本,如用户姓名。
-
文本型:
TINYTEXT
:非常短的文本,如注释。TEXT
:标准的文本数据,如博客文章。MEDIUMTEXT
:中等长度的文本,如较长的文章。LONGTEXT
:极长文本数据,适用于存储大型文本,如书籍内容。
-
二进制型:
BINARY
、VARBINARY
:类似于CHAR
和VARCHAR
,但是用于二进制字符串。TINYBLOB
、BLOB
、MEDIUMBLOB
、LONGBLOB
:用于存储二进制数据,如图片或文件。
空间类型
GEOMETRY
、POINT
、LINESTRING
、POLYGON
等:这些类型用于存储地理空间数据,例如在地图应用中标示位置或区域。
JSON类型
JSON
:用于存储JSON(JavaScript Object Notation)文档。在需要存储非结构化数据或复杂数据结构的应用中非常有用,例如存储配置参数或临时数据。
示例应用场景
假设你正在开发一个电子商务平台,你可能需要以下数据类型:
- 商品ID:
INT
或BIGINT
(如果预计商品数量非常大)。 - 商品价格:
DECIMAL
(用于保证价格的精确度)。 - 用户名:
VARCHAR
(因为用户名长度可能不同)。 - 用户密码:
VARCHAR
(通常存储密码的散列值)。 - 商品描述:
TEXT
(因为描述的长度可能超出VARCHAR
的限制)。 - 用户注册时间:
DATETIME
(记录日期和时间)。 - 商品图片:
BLOB
或直接存储图片的URL(如果图片以文件形式存储在数据库中)。 - 用户地理位置:
POINT
(如果需要存储用户的精确位置)。 - 用户配置:
JSON
(可以灵活地存储用户的配置设置)。
在设计数据库时,选择合适的数据类型对于优化性能、空间利用和数据完整性至关重要。正确的数据类型不仅可以减少存储空间的浪费,还可以加快查询速度,确保数据的准确性。
04 CHAR,VARCHAR 和 Text 的区别?
text用于存储文章,博客等任何可能超过VARCHAR限制的文本。
在MySQL中,TEXT
类型的列不能指定默认值。这是因为TEXT
类型是用来存储大段文本的,它们通常是不定长的,可以存储非常长的字符串,而MySQL不允许给这种类型的列指定默认值。
此外,TEXT
类型的数据通常被存储在表的数据页之外。这意味着当数据库存储和检索这种类型的数据时,可能需要更多的磁盘I/O操作,因为它必须跨越不同的位置。这种存储方式与CHAR
和VARCHAR
类型相比,可能会使得处理速度较慢。
下面是一个简单的例子来解释这一点:
假设你有一个博客系统,每篇博客的内容可能包括大量文本。你可以为博客内容创建一个TEXT
类型的列。
CREATE TABLE blog_posts (id INT AUTO_INCREMENT PRIMARY KEY,title VARCHAR(255),content TEXT,published_date DATETIME
);
在这个blog_posts
表中,content
列被定义为TEXT
类型,因为博客文章可能非常长,超过了VARCHAR
类型的最大长度限制。
现在,如果你想为content
列设置一个默认值(比如一个空字符串),这样的操作是不被允许的:
ALTER TABLE blog_posts ALTER COLUMN content SET DEFAULT '';
执行这条语句会导致错误,因为TEXT
类型的列不支持默认值。
当你要查询表中的博客文章时:
SELECT * FROM blog_posts WHERE id = 1;
MySQL首先从表的主数据页中读取行的基本信息,如果content
列的数据存储在表外,MySQL还需要做额外的I/O操作去检索这部分文本数据,这可能比直接从表内读取数据慢。
这种表外存储通常适用于TEXT
和BLOB
类型的数据,因为它们的长度可能会非常长,如果存储在表内可能会造成表的数据页过大,影响其他列的检索性能。通过这种方式,MySQL可以更有效地管理内存和存储空间,尽管可能会牺牲一些性能。
表外存储
“表外存储”(也被称作"溢出"或"外部存储")的概念,是指数据实际上并不存储在数据库的主数据文件中的同一个数据页(或行)上。在MySQL中,尽管所有数据都存储在MySQL服务器管理的文件系统中,某些类型的数据可能不会直接存储在表的主数据结构中。
在MySQL中,一个表通常由一系列的数据页组成,每页大小默认为16KB。对于大部分的数据类型,如INT
、CHAR
、VARCHAR
,其数据是直接存储在数据页内部的。这意味着数据与表的其他部分紧密排列在一起,可以通过单个磁盘I/O操作读取。
然而,对于TEXT
和BLOB
这样的大型数据类型,如果文本或二进制数据非常大,这些数据可能不会完全存储在同一个数据页中,特别是当它们超过页大小时。MySQL会将数据的一个部分或全部存储在表的主结构之外的地方,仅仅在数据页中保留一个指针来引用这些数据。当需要查询这些数据时,MySQL首先读取数据页以获取指针,然后通过指针去读取实际存储的数据,这就需要额外的磁盘I/O操作。
这种设计允许MySQL更有效地处理大量的大型数据对象,因为这些大对象如果存储在表内,会极大地增加表的大小,导致常规查询的性能下降。通过将它们存储在表外,MySQL能够维持数据页的紧凑性和效率,同时仍能处理大型数据。
虽然从逻辑上看,这些数据仍然是表的一部分,但从物理存储的角度来看,它们是分开存储的,而且可能分散在不同的磁盘位置。这就是所谓的"表外存储"。
05 什么是三大范式?
数据库设计的"三大范式"是指三个基本的规则,用来指导数据库表结构的设计,以减少数据的冗余和改善数据的逻辑结构。遵循这些范式可以帮助设计出既节省空间又能提高效率的数据库。
第一范式(1NF):列的原子性
规则:表的每一列都是不可分割的原子数据项,同一列中的所有数据项都是相同类型的单一数据。
解释:每个字段都应该是最小的数据单位,不可以再分割。例如,你不应该在一个字段中存储多个电话号码,而是应该为每个电话号码提供单独的字段。
例子:
不符合1NF的表结构:
| 客户ID | 客户名称 | 订单 |
|--------|----------|------------|
| 1 | 张三 | 订单1, 订单2 |
| 2 | 李四 | 订单3 |
在上面的表中,订单列包含了多个订单号,不满足1NF的要求。
符合1NF的表结构:
| 客户ID | 客户名称 | 订单 |
|--------|----------|-------|
| 1 | 张三 | 订单1 |
| 1 | 张三 | 订单2 |
| 2 | 李四 | 订单3 |
在这个修改后的表中,每个订单都有自己的行,满足了1NF。
第二范式(2NF):消除部分依赖
规则:在1NF的基础上,表必须有一个主键,并且非主键字段必须完全依赖于主键,而不是依赖于主键的一部分(只适用于组合主键)。
解释:如果一个表有一个组合主键,那么表中的其他数据应该与整个主键有关系,而不是仅与主键的一部分有关系。
例子:
不符合2NF的表结构:
| 学生ID | 课程ID | 学生姓名 | 课程名称 |
|--------|--------|----------|-----------|
| 1 | 101 | 张三 | 数学 |
| 1 | 102 | 张三 | 物理 |
| 2 | 101 | 李四 | 数学 |
在这个表中,学生姓名只依赖于学生ID,而课程名称只依赖于课程ID。这违反了2NF。
符合2NF的表结构:
学生表:
相关文章:

mysql 问题解答
01 Mysql有哪些数据类型 MySQL支持多种数据类型,这些类型可以分为几个大的类别:数值类型、日期和时间类型、字符串(字符和字节)类型、空间类型、JSON类型。下面是每种类型的简要说明和用途,以及示例。 数值类型 整型: TINYINT:非常小的整数,如性别标识(0代表女性,1代…...

组件与Props:React中构建可复用UI的基石
目录 组件:构建现代UI的基本单位 Props:组件之间的数据传递 Props的灵活性:构建可配置的组件 组件间的通信:通过回调函数传递数据 总结: 组件:构建现代UI的基本单位 组件是前端开发中的关键概念之一。…...

接口框架第二篇—unittest/pytest 有什么区别
1.用例编写方法 unittest 1)测试文件必须导入unittest包 2)测试类必须继承unittest.TestCase 3)测试类必须有unittest.main()方法 4)测试方法必须要以test_打头 pytest 1)测试文件名要以test_打头,或…...

Window 7 / 10 / 11 .bat .cmd 中文路径不识别解决方案
一般都是编码问题 我们在批处理的第一行加入: chcp 65001 进行转为UTF-8 编码就可以实现中文路径识别...

Linux命令(113)之rev
linux命令之rev 1.rev介绍 linux命令rev是将文件中的每行内容已字符为单位反向输出,即第一个字符最后输出,最后一个字符最先输出 2.rev用法 rev [参数] filename rev参数 参数说明-V显示版本信息-h显示帮助信息 3.实例 3.1.显示rev的版本信息 命令…...

QT+SQLite数据库配置和使用
一、简介 1.1 SQLite(sql)是一款开源轻量级的数据库软件,不需要server,可以集成在其他软件中,非常适合嵌入式系统。Qt5以上版本可以直接使用SQLite(Qt自带驱动)。 二、下载和配置 2.1 SQLite下载…...

若依分离版——配置多数据源(mysql和oracle),实现一个方法操作多个数据源
目录 一、若依平台配置 二、编写oracle数据库访问的各类文件 三. 一个方法操作多个数据源 一、若依平台配置 1、在ruoyi-admin的pom.xml添加依赖 <dependency> <groupId>com.oracle</groupId> <artifactId>ojdbc6</artifactId> <version…...

Seata入门系列【19】分布式事务之CAP、BASE理论
1 CAP理论 CAP是以下三个词语的缩写: Consistency:一致性Availability:可用性Partition tolerance:分区容忍性 CAP理论的基础概念就是在分布式系统中,无法同时满足以上三点。 下面我们以一个简单的分布式系统&…...

界面控件DevExpress WPF Gauge组件 - 轻松实现个性化商业仪表盘
DevExpress WPF Gauge(仪表)控件包含了多种圆形仪表类型、水平和垂直线性仪表、分段和矩阵数字仪表以及状态指示器,同时还具有最终用户交互性的集成支持。 P.S:DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至…...

算法题:870. 优势洗牌
该算法是临时想出来的,Java代码的实现在时间上不占优,之后有时间要优化一下,目前就是给大家提供一下思路。 解题思路:田忌赛马的思想 贪心法。 Step1. 对两个数组进行排序。 Step2. 同时遍历排序后的nums2和nums1,将…...

[架构之路-252/创业之路-83]:目标系统 - 纵向分层 - 企业信息化的呈现形态:常见企业信息化软件系统 - 企业应用信息系统集成
目录 第一章 什么是企业应用信息系统集成What 1.1 简介 1.2 架构 二、为什么需要企业应用信息系统集成Why 三、如何实现企业应用信息系统集成 3.1 步骤 3.2 企业应用集成的层次 3.3 业务流程重组 第一章 什么是企业应用信息系统集成What 1.1 简介 企业应用信息系统集…...

MFC发送http https以及json解析
域名解析成IP char szWeb[128] "www.baidu.com";struct hostent *pHost NULL;pHost gethostbyname(szWeb);//完成主机名到域名的解析char *IP inet_ntoa(*((struct in_addr *)pHost->h_addr));CString ipStr IP;请求三部曲: 1、CInternetSession…...

UE5加载websocket模块为空
今天测试UE 发现工程启动不了,后来看到原来是websocket模块无法加载。 解决的它的方法很简单,这种问题一般会出现在源码版本的引擎或者是停电了,导致UElaunch版本损坏,解决方法是来到源码版本的引擎 这个目录下: D:\…...

学习 Python 数据可视化,如何快速入门?
Python 是一种非常流行的编程语言,具有简单易学、高效、丰富的库和工具等特点。其中,数据可视化是 Python 的一个重要应用领域,可以帮助人们更好地理解和分析数据。本文将介绍如何快速入门 Python 数据可视化,以及常用的可视化工具…...

XUbuntu22.04之simplenote支持的Markdown语法总结(一百九十一)
简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…...

JAVA深化篇_26——Apache commons-io工具包的使用
Apache commons-io工具包的使用 Apache基金会介绍 Apache软件基金会(也就是Apache Software Foundation,简称为ASF),是专门为支持开源软件项目而办的一个非盈利性组织。在它所支持的Apache项目与子项目中,所发行的软…...

centos 7 kafka2.6单机安装及动态认证SASL SCRAM配置
目录 1.kfaka安装篇 1.1 安装jdk 1.2安装kafka 2.安全篇 2.1 kafka安全涉及3部份: 2.2 Kafka权限控制认证方式 2.3 SASL/SCRAM-SHA-256 配置实例 2.3.1 创建用户 2.3.2 创建 JAAS 文件及配置 3.测试 3.1 创建测试用户 3.2 配置JAAS 文件 3.2.1 生产者配…...

TrafficWatch 数据包嗅探器工具
TrafficWatch 是一种数据包嗅探器工具,允许您监视和分析 PCAP 文件中的网络流量。它提供了对各种网络协议的深入了解,并可以帮助进行网络故障排除、安全分析等。 针对 ARP、ICMP、TCP、UDP、DNS、DHCP、HTTP、SNMP、LLMNR 和 NetBIOS 的特定于协议的数据…...

MySQL Binlog实战应用之一
一、前言 开发业务系统尤其是与财务相关的系统,需要记录每一笔变更操作的日志,这一般有两种实现方案。 1、代码中通过AOP实现,提供注解跟踪记录日志,这种方案能够比较清晰地以业务角度记录操作日志,但记录变更前的旧…...

【MySQL】MVCC机制(undo log,read view)
文章目录 前言一. 预备知识二. 模拟MVCC三. Read View四. RC与RR的本质区别结束语 前言 MVCC(多版本并发控制)是一种用来解决读-写冲突的无锁并发控制 MVCC为事务分配单向增长的事务ID,为每个修改保存一个版本,版本与事物ID相关联…...

gma 2 教程(三)坐标参考系统:3.投影方法
安装 gma:pip install gma 地图投影是利用一定数学法则把地球表面的经、纬线转换到平面上的理论和方法。由于地球是一个赤道略宽两极略扁的不规则的梨形球体,故其表面是一个不可展平的曲面,所以运用任何数学方法进行这种转换都会产生误差和变…...

蓝桥杯每日一题2023.11.2
题目描述 等差素数列 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题我们需要求出最小的公差并且长度为10, 1.确保序列开始为素数 2.确定枚举的个数 注意:序列中数只是d的变化,可以通过此计算将开始数字后9个数字都计算出来,d是…...

Leetcode67二进制求和
1104 代码: class Solution {public String addBinary(String a, String b) {StringBuffer ans new StringBuffer();int n Math.max(a.length(),b.length()),carry 0;for(int i0;i<n;i){carry i < a.length()?(a.charAt(a.length()-1-i)-0):0;carry i…...
线性代数 第五章 特征值与特征向量
一、特征值定义 二、特征值求法 定义法;;相似。 三、特征向量求法 定义法;基础解系法;;相似。 四、特征值性质 不同特征值的特征向量线性无关k重特征值至多有k个线性无关的特征向量 五、相似的定义 若ÿ…...

Python嵌入式数据库 / 轻量级数据库 / 小型数据库介绍(SQLite、Pandas DataFrame、TinyDB)(python数据库)
文章目录 Python嵌入式数据库/轻量级数据库介绍什么是嵌入式数据库/轻量级数据库?SQLitePandasTinyDB总结 Python嵌入式数据库/轻量级数据库介绍 在构建应用程序时,数据存储是必不可少的一部分。传统的方式是使用如MySQL、PostgreSQL这样的重量级数据库…...
USB PD v1.0快速充电通信原理
1 原理 本篇文章讲的快速充电是指USB论坛所发布的USB Power Delivery快速充电规范(通过VBUS直流电平上耦合FSK信号来请求充电器调整输出电压和电流的过程),不同于本人发布的另一篇文章所讲的高通Quick Charger 2.0规范,因为高通QC…...

【华为】路由器以PPPoE拨号接入广域网
组网需求 用户希望以PPPoE拨号方式接入广域网,如图1所示,Router作为PPPoE客户端,得到PPPoE服务器的认证后获得IP地址,实现用户接入互联网的需求。内网网关地址(即VLANIF1接口的IP地址)为10.137.32.1/24。 …...

Linux内核分析(一)--内核架构和子系统
目录 一、引言 二、内核架构 ------>2.1、kernel源码获取 ------>2.2、cpuinfo ------>2.3、内核体系结构 ------>2.4、内核主要组件 三、内核源码及子系统 ------>3.1、整体结构与子系统 ------>3.2、cpuinfo ------>3.3、整体结构与子系统 -…...

【PyQt学习篇 · ⑨】:QWidget -控件交互
文章目录 是否可用是否显示/隐藏是否编辑是否为活跃窗口关闭综合案例信息提示状态提示工具提示“这是什么”提示 焦点控制单个控件角度父控件角度 是否可用 setEnabled(bool):该函数用于设置QWidget控件的可用性,参数bool为True表示该控件为可用状态&…...

新版本IntelliJ IDEA(如2023)中运行Spring Boot找不到VM options进行端口的修改的问题解决
问题 如下图找不到VM options。 解决 进行如下操作即可。...