《Mysql 数据类型》
一:数据类型选择标准
- 更小的通常更好
- 在没有低估需要存储值的范围时,选择可以正确存储数据的最小数据类型。
- 最小的数据类型通常更快,因为他们占用更少的磁盘/内存/CPU缓存,并且处理更快。
- 简单就好
- 简单的类型通常需要更少的CPU周期。
- 例如 整型比字符操作代价更低 / 使用Mysql内建类型而不是字符串存储日期。
- 避免使用 Null
- Null 使得 Mysql 在 索引/统计/比较 执行优化时,行为更为复杂。
- 而且需要更多的存储空间去保存Null.
三:整型
- 常用类型
类型 字节 位 范围 无符号范围-2(N-1)至2(N-1)-1 无符号范围2(N)-1
TINYINT 1 8 2的8次方 -128 — 127 0 — 255
SMALLINT 2 16 2的16次方 -3276 8 — 3276 7 0 — 6553 5
MEDIUMINT 3 24 2的24次方 -8388608 - 8388607 0 - 1677 7215
INT 4 32 2的32次方 -2147 4836 46 — 2147 4836 47 0 — 4294 9672 95
BIGNET 8 64 很大,够用
- 使用选择
- 在 整型 的使用上,这些类型在很大程度上是相同的,只有它们存储的值的范围是不相同的。
- 所以需要根据使用值 范围 来选择 整型类型。
- 关于整型宽度 (zerofill)
- MySQL 以一个可选的显示宽度指示器的形式对 SQL 标准进行扩展(如 INT(6),6即是其宽度指示器。
- 该宽度指示器并不会影响int列存储字段的大小,也就是说,超过6位它不会自动截取,依然会存储,只有超过它本身的存储范围才会截取;此
- 处宽度指示器的作用在于该字段是否有zerofill,如果有就未满足6位的部分就会用0来填充
- 注意的是,使用一个宽度指示器不会影响字段的大小和它可以存储的值的范围。
- 设置一个字段为 zerofill 那么它必然是 unsigned 的。
// 创建字段
mysql> create table `demo` ( `num` tinyint() zerofill);
Query OK, rows affected (0.03 sec) // 查看字段属性
mysql> desc demo;
+----------+------------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------------------+------+-----+---------+-------+
| num | tinyint() unsigned zerofill | YES | | NULL | |
+----------+------------------------------+------+-----+---------+-------+
row in set (0.00 sec)
// 插入数据
mysql> insert into demo values ();
Query OK, row affected (0.00 sec) // 查看数据 (宽度补充)
mysql> select * from demo;
+------+
| num |
+------+
| |
+------+
四: 浮点型(如果可以,请尽量使用整数来表示浮点数值)
- 常用类型
类型 占用(字节)
FLOAT(M,D)
DOUBLE(M,D)
DECIMAL(M, D) M+ 字节 默认为(,) M 表示可以显示多少位数字(数字+小数点)
D 位于小数点后,又称 精度/标度
(数据的精度总是能精确到D位,也就是数据的不精确一定出现在小数点后)
(数据存储的时候只能存储到D位小数)
超出的位,Mysql会四舍五入进行保存
- 使用选择
- 对于精度准确度要求不高的浮点数存储可以使用 float。
- float/double 不准确在于,在 Mysql 中,数据精确度取决于分配给数据结构的长度。在按照长度进行二进制转换时候,就会造成数据的不不准确。
- double 和 float 的区别是 double 精度高,有效数字 16 位,float 精度 7 位。
- 但 double 消耗内存是 float 的两倍,double 的运算速度比 float 慢得多,
- SO,能用 float 时不要用 double(以省内存,加快运算速度)。
- 如果需要存储一个准确的 浮点数 ,使用 DECIMAL。
- 但是 DECIMAL 存储长度最大为 65.
- 如果需要更大精度,可以使用 字符串 存储
- 《MySQL如何选择float, double, decimal》
五:字符串
- 常用类型
类型 占用(字节)
char(n) 3 * n
varchar(n) 3 * 实际
BLOB
TEXT
- 使用场景
- CHAR
- CHAR善于存储经常改变的值,或者长度相对固定的值,比如type、ip地址或md5之类的数据,由于 char 定长 不容易产生碎片。
- 比如CHAR(30)能放30个字符,存放abcd时,尾部会以空格补齐,实际占用空间 30 * 3bytes (utf8)。检索它的时候尾部空格会被去除。
- VARCHAR
- VARCHAR善于存储值的长短不一的列,也是用的最多的一种类型,节省磁盘空间。
- BLOB(不建议使用)
- 可以存储二进制,照片等( 会引起一些性能问题)
- TEXT(不建议使用)
- 只能保存字符,日记( 会引起一些性能问题)
- CHAR 和 VARCHAR 的区别
- 使用对比
- Char 的最大长度为 0-255 字符,Varchar 收到最大行长度的限制,行最大为 65535 字节。
- Char 会自动去除行尾空格。(如果字段设置了 unqiue, 那么在空格去除之后,也会引起冲突)
- 内存对比
- Char 是固定长度,处理速度会比 Varcahr 快一些,但同时 Char 会浪费存储,程序需要对空格做出处理.
- Varchar 可变长度,在使用时也需要不要直接给一个大值。因为在Mysql内部分配内存时候,也会根据默认值分配内存。
- 场景对比
- 对于长度变化不大,对于查询速度有较高要求的选用 Char, 可变长选用 Varchar.
- 储存方式对比
六:日期类型
- 常用类型
类型 保存信息 占用(字节)
DATE 年月日
DATETIME 年月日时分秒
TIME 时分秒
TIMESTAMP 年月日时分秒
YEAR 年
- 使用场景
- DATE/DATETIME/TIME 由于其存储信息不同,所以根据需要保存内容选择。
- 由于 TIMESTAMP 支持时间太小(至 2038年), 所以时间存储尽量使用 DATETIME
- 如果只想保存年份,使用 YEAR
《Mysql 数据类型》的更多相关文章
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 利用ssh反向代理以及autossh实现从外网连接内网服务器
前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
- 怎样从外网访问内网OpenLDAP数据库
外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...
随机推荐
- Effective Java 第三版——73.抛出合乎于抽象的异常
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- CentOS 7.2编译安装Tengine
Tengine官网上有个非常简单的教程,中间并未涉及到一些常用的设置,所以仅供参考.一下午为本人的安装步骤及过程. 配置firewalld,iptables,关闭SELINUX 1.安装必要的编译环境 ...
- hive SQL COALESCE 函数
COALESCE是一个函数, (expression_1, expression_2, ...,expression_n)依次参考各参数表达式,遇到非null值即停止并返回该值.如果所有的表达式都是空 ...
- 一次python 内存泄漏解决过程
最近工作中慢慢开始用python协程相关的东西,所以用到了一些相关模块,如aiohttp, aiomysql, aioredis等,用的过程中也碰到的很多问题,这里整理了一次内存泄漏的问题 通常我们写 ...
- 适用于 Windows 10 的触摸板手势
高级用户! 在 Windows 10 笔记本电脑的触摸板上试用这些手势: 选择项目:点击触摸板. 滚动:将两根手指放在触摸板上,然后以水平或垂直方向滑动. 放大或缩小:将两根手指放在触摸板上,然后收缩 ...
- [转]JS判断字符串是否为json数据
原文地址:https://blog.csdn.net/qq_26400953/article/details/77411520 这周碰到了很多问题,尽量把遇到的问题都记录下来. JS判断字符串是否为j ...
- 印象笔记中的美人鱼 mermaid
美人鱼 mermaid 是印象笔记中Markdown模式下新增的一种代码模式,它能支持更多的高级图表功能,如流程图.甘特图.时序图. 我最喜欢的应该是甘特图,最惊喜的是流程图. 当然,印象笔记还支持其 ...
- Linux操作系统配置Go语言编程环境
之前一直在windows下写Go,现在工作环境切换至Linux下,因此写下此文,记录安装Go环境的过程. 操作系统:CentOS7.5 一.安装步骤 1,下载Go语言安装包 yum install g ...
- final可以修饰类、属性、方法。
当用final修饰类的时候,此类不可被继承,即final类没有子类.这样可以用final保证用户调用时动作的一致性,可以防止子类覆盖情况的发生. 当利用final修饰一个属性(变量)的时候,此 ...
- ASP.NET Web Forms - 网站导航(Sitemap 文件)
[参考]ASP.NET Web Forms - 导航 ASP.NET 带有内建的导航控件. 网站导航 维护大型网站的菜单是困难而且费时的. 在 ASP.NET 中,菜单可存储在文件中,这样易于维护.文 ...