极客时间 MySQL 字段
字段
MySQL 中有很多字段类型,比如整数、文本、浮点数,等等。如果类型定义合理,就能节省存储空间,提升数据查询和处理的速度,相反,如果数据类型定义不合理,就有可能会 导致数据超出取值范围,引发系统报错,甚至可能会出现计算错误的情况,进而影响到整个系统。
整数类型
因此,我建议你首先确保数据不会超过取值范围,在这个前提之下,再去考虑 如何节省存储空间.
浮点数类型和定点数类型
FLOAT
表示单精度浮点数;DOUBLE
表示双精度浮点数;FLOAT
占用字节数少,取值范围小;DOUBLE
占用字节数多,取值范围也大。REAL
默认就是DOUBLE
。如果你把SQL
模式设定为启用“REAL_AS_FLOAT”
,那 么,MySQL
就认为REAL
是FLOAT
。如果要启用“REAL_AS_FLOAT”,就可以通过 以下 SQL 语句实现:
SET sql_mode = “REAL_AS_FLOAT”;
浮点数类型有个缺陷,就是不精准。因此,在一些对精确度要求 较高的项目中,千万不要使用浮点数,不然会导致结果错误,甚至是造成不可挽回的损失。
CREATE TABLE demo.goodsmaster (
barcode TEXT, goodsname TEXT, price DOUBLE, itemnumber INT PRIMARY KEY AUTO_INCREMENT
);
INSERT INTO demo.goodsmaster (
barcode, goodsname, price
) VALUES (
'0001', '书', 0.47
);INSERT INTO demo.goodsmaster (
barcode, goodsname, price
) VALUES (
'0002', '笔', 0.44
);INSERT INTO demo.goodsmaster (
barcode, goodsname, price
) VALUES (
'0002', '胶水', 0.19
);SELECT * from demo.goodsmaster;SELECT SUM(price)
FROM demo.goodsmaster;SELECT * FROM demo.goodsmaster
WHERE SUM(price)=1.1
其中 price
就是浮点数类型 得到结果是
问题还是出在 MySQL 对浮点类型数据的存储方式上。
MySQL 用 4 个字节存储 FLOAT 类型数据,用 8 个字节来存储 DOUBLE 类型数据。无论哪个,都是采用二进制的方式来进行存储的。比如 9.625,用二进制来表达,就是 1001.101。如果尾数不是 0 或 5,就无法用一个二进制数来精确表达就只好在取值允许的范围内进行近似(四舍五入)。数据类型是 DOUBLE 的时候,我们得到的结果误差更小一些, 而数据类型是 FLOAT 的时候,误差会更大一下。原因就是,DOUBLE 有 8 位字节,精度更高。
优化 : 定点数类型:DECIMAL。
DECIMAL(M,D)
的方式表示高精度小数。M 表示整数部分加小数部分,一共有多少位,M<=65。D 表示小数部分位数,D<M
ALTER TABLE demo.goodsmaster
MODIFY COLUMN price DECIMAL(5, 2);SELECT SUM(price)
FROM demo.goodsmaster;
总结:
浮点类型取值范围大,但是不精准,适用于需要取值范围大,又可以容忍微小误差的科学计算场景(比如计算化学、分子建模、流体动力学 等);定点数类型取值范围相对小,但是精准,没有误差,适合于对精度要求极高的场景 (比如涉及金额计算的场景)。
文本类型
- CHAR(M):固定长度字符串。CHAR(M) 类型必须预先定义字符串长度。如果太短,数 据可能会超出范围;如果太长,又浪费存储空间。
- VARCHAR(M): 可变长度字符串。VARCHAR(M) 也需要预先知道字符串的最大长度, 不过只要不超过这个最大长度,具体存储的时候,是按照实际字符串长度存储的。
- TEXT:字符串。系统自动按照实际长度存储,不需要预先定义长度。
- ENUM: 枚举类型,取值必须是预先设定的一组字符串值范围之内的一个,必须要知道 字符串所有可能的取值。
- SET:是一个字符串对象,取值必须是在预先设定的字符串值范围之内的 0 个或多个, 也必须知道字符串所有可能的取值。
对于 ENUM 类型和 SET 类型来说 一般用于 参数设定的取值范围只有几个固定值的场景 , 其中 TEXT 类 型最为灵活方便。
TEXT 类型也有 4 种,它们的区别就是最大长度不同。
- TINYTEXT:255 字符(这里假设字符是 ASCII 码,一个字符占用一个字节,下同)。
- TEXT: 65535 字符。
- MEDIUMTEXT:167 77215 字符。
- LONGTEXT: 4294967295 字符(相当于 4GB)。
由于实际存储的长度不确定,MySQL 不允许 TEXT 类型的字段做主键。遇到这种情况,你只能采用 CHAR(M),或者 VARCHAR(M),非主段的就可以按照数据可能的最大长度, 选择这几种 TEXT 类型中的的一种,作为存储字符串的数据类型。
日期与时间类型
实际项目中尽量使用 DATETIME ( 因为这个数据类型使用起来比较方便为了确保数据的完整性和系统的稳定性,优先考虑使用 DATETIME 类型)
TIME 类型,不光表示一天之内的时间,而且可以用来表示一 个时间间隔,这个时间间隔可以超过 24 小时。 所以不是-23:59:59~23:59:59
总结
俩个重要语句:
-- 修改字段类型语句
ALTER TABLE demo.goodsmaster
MODIFY COLUMN price DECIMAL(5, 2); -- 计算字段合计函数:
SELECT SUM(price)
FROM demo.goodsmaster;
在定义数据类型时,如果确定是整数,就用 INT; 如果是小数,一定用定点数类型 DECIMAL;如果是字符串,只要不是主键,就用 TEXT; 如果是日期与时间,就用 DATETIME
- 整数:INT。
- 小数:DECIMAL。
- 字符串:TEXT。
- 日期与时间:DATETIME。
假设用户需要一个表来记录会员信息,会员信息包括会员卡编号、会员名称、会员电话、 积分值。
CREATE TABLE demo.memberinfo (id INT PRIMARY KEY AUTO_INCREMENT,cardnumber TEXT,membername TEXT,telephone TEXT
);
极客时间 MySQL 字段相关推荐
- 关于极客时间 | MySQL实战45讲的部分总结
文章目录 MySQL为什么有时候会选错索引 1.MySQL选择索引的依据 1.1 基于主键的成本计算 1.2 对于二级索引+回表方式的成本计算 2.基于索引统计数据的成本计算 2.1 index di ...
- 极客时间MySQL实战45讲学习笔记
零:基础 第一讲:基础架构:一条SQL查询语句是如何执行的? MySQL的基本架构示意图 1.MySQL基础架构 大体来说,MySQL可以分为Server层和存储引擎层两部分. Server层包括连接 ...
- 本人亲自整理的极客时间设计模式之美的硬核笔记
由于笔记内容过多,我把它放到语雀上了. 点击我 以下内容是为了让搜索引擎,检测到这篇文章.要阅读体验,请点击上面的连接"点击我",去我的语雀看.对了,我看到语雀那里有投诉的功能,请 ...
- 【极客时间】《MySQL45讲》学习笔记
内容来源:开篇词 | 这一次,让我们一起来搞懂MySQL-极客时间 以下是来自网友对课程的知识点的分类总结: 本章内容[本章内容建议阅读时长] 编号|建议阅读时长|文章标题 1. 基础知识[12'] ...
- 测试 极客时间_针对数据极客和记者测试DocHive
测试 极客时间 呼吁所有数据极客和发烧友! 测试现已在DocHive 上开放- 从GitHub开始 . DocHive是一个开源的Ruby on Rails项目,用于从基于图像的PDF捕获数据. Do ...
- 硅谷python_来自硅谷的Python最佳实践指南 | 极客时间
这几年,学 Python 的程序员的确越来越多了,甚至不少人把 Python 当作第一语言来学习.也难怪,Python 的优点太多了,它语言简洁.开发效率高.可移植性强,并且可以和其他编程语言(比如 ...
- 极客时间 资源_极客学校:学习Windows 7 –资源访问
极客时间 资源 In this installation of Geek School, we take a look at Folder Virtualization, SIDs and Permi ...
- 【小工具】极客时间GitChat专栏下载脚本
我想下载极客时间&GitChat专栏的课程并生成PDF 如果你是极客时间或者GitChat的使用者,不知道有没有将付费购买的专栏持久化成PDF放在自己任意设备上阅读的需求 如果有的话,那么我们 ...
- 极客时间和极客学院_极客奔跑
极客时间和极客学院 I'm not a natural runner. I'm reasonably fit given that I spend most of the day sat in my ...
- java爬虫抓取极客时间专栏页面
0.clone代码导入idea 项目地址: github项目 1.登录极客时间账号,查看cookie信息.在代码com.ady01.demo4.jksj.util.CollectorUtil#COOK ...
最新文章
- 杭电2028--Lowest Common Multiple Plus
- CSS3盒模型display:box详解
- mysql数据库系统配置文件_MySQL数据库(6)----配置文件 my.cnf 的使用
- c语言中常量有何作用,C语言const的用法详解,C语言常量定义详解
- vs2013+EF6+Mysql
- gson json转map_Java 中几种常用 JSON 库性能比较
- Spring Boot中实现简单表单提交(登录功能)
- 2021.08.25学习内容torch.clamp(input, min, max, out=None) → Tensor,torch.mm(matrix multiply)
- ubuntu16.04 离线安装docker ce
- reshape [] matlab,matlab reshape函数
- 同济大学c语言程序设计答案,2020年同济大学道路与铁道工程考研真题试卷及试题答案,汽车理论及设计考研试题下载...
- 使用C#实现DHT磁力搜索的BT种子后端管理程序+数据库设计(开源)[搜片神器]
- 原生js实现动态生成表格
- Android Binder机制原理
- Android人脸支付功能,android支付宝上刷脸支付的人脸识别技术
- lg、ln的表示方法
- 姜小白的Python日记Day9 变量与递归
- html之简单新闻网制作
- R 语言怎么保存工作目录到当前路径_第一讲 R基本介绍及安装
- 华为鸿蒙系统英语报纸_华为鸿蒙系统报名方法