MySQL 数据类型及最优选取规则

目录
  • 数据类型
  • 整型
    • 浮点型
    • 定点数
    • 字符型
    • 日期时间型
    • 字段类型的选取原则

数据类型

日常开发中,最常使用到的 MySQL 中常用的数据类型有 : 整型, 浮点型, 定点数, 字符型, 时间日期类型. 下面对其分别进行总结。

整型

格式为 : INT[(M)] [UNSIGNED] [ZEROFILL]

  • 取值范围:如果是 unsigned 无符号位 , 则最大值翻倍, 如 tinyint unsigned 的取值范围为 (0~256).
  • 注意:INT(1) 和 INT(10) 没有区别, 占用的内存都一样, 并不是代表其最大位数,只是加上 (M) 值后, 在 CMD 中显示的结果的宽度不同而已. 只有在加上 zerofill 零填充后 M 才表现出有点点效果, 比如 int(3) zerofill, 插入到数据库里的是 10, 则实际插入为 010, 也就是在前面补充加了一个0.
  • Java 中的 Long 类型, 和 MySQL 中的 bigint 相对应.
  • Java 中的 Integer 类型, 和 MySQL 中的 int 相对应.
  • Java 中的 Boolean 类型, 和 MySQL 中的 tinyint 相对应.  false 代表 0, true 代表 1.

浮点型

  • 设一个字段定义为 float(5,3), 5 表示在 CMD 中显示的总位数是 5 位, 3 表示小数位是 3 位.
  • 小数位超过指定长度, 对后面的数字按照四舍五入截取. 所以如果插入一个数 123.45678, 实际数据库里存的是123.457, 进行了四舍五入截取.
  • 小数位如果都是0, 则不保存小数位, 直接保存整数.

定点数

浮点型在数据库中存放的是近似值, 而定点类型在数据库中存放的是精确值. 所以对于金额等精度要求高的数据, 使用定点数 decimal 来保存.

decimal(m,d) 参数 m 是总个数, d 是小数位.  ( m<65, d<30, d<m )

字符型

字符型 含义 占用字节数
char(n) 固定长度, 最多 255 个字符 4 byte
varchar(n) 可变长度, 最多 65535 个字符 实际存入字节数+1
  • char 类型的字符串检索速度要比 varchar 类型的快. 所以能 char 的优先 选择 char.
  • char(n) 若存入字符数小于 n, 则以空格补于其后, 查询之时再将空格去掉. 所以 char 类型存储的字符串末尾不能有空格, varchar 不限于此.
  • char(n) 固定长度, char(4) 不管是存入几个字符, 都将占用 4 个字节. varchar 可变长度, 是存入的实际字符数+1个字节(n<=255)或 2 个字节(n>255),  所以 varchar(4), 存入3 个字符将占用 4 个字节.
  • varchar(10) 的 10 代表了申请的空间长度, 即存储的数据的最大长度, 而 int(10) 的 10 只是代表了展示的长度.

日期时间型

日期时间类型 占用空间(字节数) 日期格式
DATETIME 8 byte YYYY-MM-DD HH:MM:SS
TIMESTAMP 4 byte YYYY-MM-DD HH:MM:SS
DATE 4 byte YYYY-MM-DD
TIME 3 byte HH:MM:SS
YEAR 1 byte YYYY
  • 根据实际需要选择能够满足的最小存储的类型即可. 比如 : DATE 用于表示 年月日, 生日字段使用 DATE 类型即可. 这样不但能节省内存, 还能提高表的操作效率.
  • 如果要记录年月日时分秒, 而且记录的年代比较久远, 最好使用 DATETIME. 因为 TIMESTAMP 可以表示的年代范围比 DATETIME 少的多.
  • 如果记录的日期需要用到时区, 需要选择 TIMESTAMP.
  • 一个表中至多只能有一个字段设置 CURRENT_TIMESTAMP. 并且 CURRENT_TIMESTAMP 只适合 TIMESTAMP 类型的字段.
CREATE TABLE USER(
  ...
  create_time timestamp NULL default CURRENT_TIMESTAMP,    -- 默认为当前时间
  ...
)

字段类型的选取原则

  • 字段类型优先级 : 整型 > date,time > char,varchar > blob

原因:整型运算快, 且节省空间. char, varchar 要考虑字符集的转换与排序时的校对集, 所以速度慢.

  • 优先选择占空间小的类型.

原因 : 小空间的类型占用的磁盘, 内存, CPU 缓存, CPU 处理时间都更少.

  • 对于字符型和数字型, 优先选择数字型.

比如 : 应该使用整型来存储 IP 地址, 而不是字符型. 应该使用日期时间类型来存储日期时间, 而不是字符型.

  • 对于 char 和 varchar

如果列中的数据长度差不多一致, 比如 : 身份证号, 学号等, 则应该考虑使用 char 类型.

对于那些长度未知的字符串, 使用 varchar.

如果列中的最大数据长度小于 50 Byte (15个字符左右), 则一般考虑使用 char.

  • 对于 decimal 和 float:

精确数据只能使用 decimal 类型.

非精确数据优先使用 float 类型, ( float 比 decimal 的存储空间小 )

  • 对于那些可能值很有限的列, 使用 tinyint 代替 varchar / int

比如记录移动设备平台, 只有两个值:android, ios, 那么就可以使用 0 表示 android, 1 表示 ios, 并写好注释.

  • 不要滥用 bigint, 比如文章表的主键 id 字段, 用 int 就行了, 21 亿篇文章的上限足够使用了.

以上原则主要是从以下角度考虑 :

  • 查询速度:定长数据比变长数据查询快, 因为定长数据与数据之间的偏移是固定的, 很容易计算下一个数据的偏移.

而变长数据则还需要多一步去查询下一个数据的偏移量. 不过定长数据可能会浪费更多的存储空间.

  • 排序速度:在对数据进行比较 ( 查询条件, JOIN 条件以及排序 ) 操作时, 同样的数据, 数字的处理比字符串快.

字符串的比较与当前的排序规则有关, 它需要去查询当前排序规则的字典顺序, 而数字不需要.

到此这篇关于MySQL 数据类型及最优选取规则的文章就介绍到这了,更多相关MySQL 数据类型内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 如何创建一个创建MySQL数据库中的datetime类型

    目录 一.domain用法及示例 二.创建MySQL中datetime类型 三.create type用法及示例 环境系统平台:Microsoft Windows (64-bit) 10版本:4.5 瀚高数据库中支持使用以下语句创建用户定义的数据类型: ​CREATE DOMAIN​:它创建了一个用户定义的数据类型,可以有可选的约束,基于其他基本类型,实质是定义一个域. ​CREATE TYPE​:它通常用于使用存储过程创建复合类型(两种或多种数据类型混合的数据类型). 一.domain用法及示

  • MySQL中JSON字段数据类型详解

    目录 前言 创建JSON值 搜索JSON类型数据 在 JSON 和非 JSON 值之间转换 JSON 值的汇总 总结 前言 JSON 类型是从 MySQL 5.7 版本开始支持的功能,MySQL 支持由RFC 7159定义的本机JSON数据类型,该类型可有效访问 JSON(JavaScript 对象 table 示法)文档中的数据.与将 JSON 格式的字符串存储在字符串列中相比,JSON数据类型具有以下优点: 自动验证存储在JSON列中的 JSON 文档.无效的文档会产生错误. 优化的存储格式

  • MySQL数据类型enum 枚举类型

    例如: 性别 gender 男 女 保密 基本语法: enum(数据值 1,数据值 2...); 数据值列表在 255 个以内,使用 1 个字节来存储 数据值列表超过 255,但是小于 65535,使用 2 个字节来存储 -- Enum(0=>'男', 1=>'女', 2=>'保密') create table my_enum( gender enum('男', '女', '保密') ) mysql> desc my_enum; +--------+----------------

  • 详解PyMySQL插入字典类型的数据

    在我们爬虫或者调API获取数据后,需要将数据存入到数据库中,如果数据是列表嵌套字典格式的话,一般做法是遍历列表,然后用字典生成对应的SQL语句再执行插入到表中.本文将介绍一种更加简便的方法来插入字典类型的数据. 我们有如下数据列表,需要将该数据插入到对应的数据表student中(表的字段名和数据列表中字典的键名相同) student_list = [ {"name": "Tony", "age": 19, "sex": &qu

  • MySQL 5.6 & 5.7最优配置文件模板(my.ini)

    Inside君整理了一份最新基于MySQL 5.6和5.7的配置文件模板,基本上可以说覆盖90%的调优选项,用户只需根据自己的服务器配置稍作修改即可,如InnoDB缓冲池的大小.IO能力(innodb_buffer_pool_size,innodb_io_capacity).特别注意,这份配置文件不用修改,可以直接运行在MySQL 5.6和5.7的版本下,这里使用了小小的技巧,具体可看配置文件.如果配置参数存在问题,也可以及时反馈Inside君,我们一起成长. 触发Inside君做这件事情的原因

  • MySQL8.0.23版本的root密码重置最优解法

    该方法编辑于2021年2月7日,自己使用的版本是8.0.23,事情的起因要从袁隆平教授说起-要从一本教科书说起,有一章节是"MySQL安全管理与权限管理",其中有提到更改root账户 ps:此方法适用于任何忘记,胡乱修改或已经糟蹋root密码的同学 本着实践主义的精神,我在自己的MySQL数据库中(当前登陆为root账户)中敲下了: update user set authentication_string=MD5("123") where user = "

  • 原来MySQL 数据类型也可以优化

    目录 不超过范围的情况下,数据类型越小越好 简单就好 尽量避免 null 一些细则 整数类型 字符和字符串类型 varchar :根据实际内容长度保存数据. char:固定长度的字符串 BLOB 和 TEXT 类型 日期时间 datetime timestamp date 使用枚举代替字符串类型 特殊类型数据 不超过范围的情况下,数据类型越小越好 应该尽量使用可以正确存储数据的最小数据类型,更小的数据类型通常更快,因为它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期更少. 但是要

  • MySQL对JSON类型字段数据进行提取和查询的实现

    目录 前言 1. 问题现象 2. 解决方案 3. JSON数据查询 3.1 一般基础查询操作 3.2 一般函数查询操作 4. JSON数据新增更新删除 前言 昨天上线后通过系统报警发现了一个bug,于是紧急进行了回滚操作,但是期间有用户下单,数据产生了影响,因此需要排查影响了哪些订单,并对数据进行修复. 1. 问题现象 由于bug导致了订单表的customer_extra_info字段的hasFreightInsurance误更新成了“是”,因此需要查询回滚前一共有多少被误更新为“是”的订单,如

  • MySQL 数据类型及最优选取规则

    目录 数据类型 整型 浮点型 定点数 字符型 日期时间型 字段类型的选取原则 数据类型 日常开发中,最常使用到的 MySQL 中常用的数据类型有 : 整型, 浮点型, 定点数, 字符型, 时间日期类型. 下面对其分别进行总结. 整型 格式为 : INT[(M)] [UNSIGNED] [ZEROFILL] 取值范围:如果是 unsigned 无符号位 , 则最大值翻倍, 如 tinyint unsigned 的取值范围为 (0~256). 注意:INT(1) 和 INT(10) 没有区别, 占用

  • 深入理解MySQL数据类型的选择优化

    目录 前言 1 整数类型 2 实数类型 3 字符串类型 3.1 VARCHAR和CHAR类型 3.1.1 最大长度 3.2 Binary和VarBinary类型 3.3 BLOB和TEXT类型 3.3 ENUM类型 4 日期和时间类型 5 位数据类型 6 选择优化的数据类型 6.1 特殊的数据类型 前言 介绍了MySQL的常用数据类型的基本特性,以及数据类型的选择优化. MySQL数据类型是定义列中可以存储什么数据以及该数据实际怎样存储的基本规则,正确的选择数据库字段的字段类型对于数据库性能有很

  • MySQL数据类型和常用字段属性总结

    前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键.M前言 好比C++中,定义int类型需要多少字节,定义double类型需要多少字节一样,MySQL对表每个列中的数据也会实行严格控制,这是数据驱动应用程序成功的关键.MySQL提供了一组可以赋给表中各个列的数据类型,每个类型都强制数据满足为该数据类型预先确定的一组规则,例如大小.类型及格式. 这里先总结数据类型.MySQL中的数据类型

  • MySQL数据类型优化原则

    MySQL支持的数据类型很多,选择正确的数据类型对于高性能至关重要.下面几个简单的原则都有助于做出更好的选择. 更小的通常更好 应该尽量使用可以正确储存数据的最小数据类型.更小的数据类型通常更快,因为它们占用更少的磁盘.内存和CPU缓存,并且处理时需要的CPU周期也更少.如果无法确定哪个数据类型时最好的,就选择你认为不会超过范围的最小类型. 简单就好 简单数据类型的操作通常需要更少的CPU周期.例如,整形比字符操作代价更低,因为字符集和校对规则(排序规则)使字符比较比整形更复杂.比如用MySQ内

  • MySQL数据类型DECIMAL用法详解

    MySQLDECIMAL数据类型用于在数据库中存储精确的数值.我们经常将DECIMAL数据类型用于保留准确精确度的列,例如会计系统中的货币数据. 要定义数据类型为DECIMAL的列,请使用以下语法: column_name DECIMAL(P,D); 在上面的语法中: P是表示有效数字数的精度.P范围为1〜65. D是表示小数点后的位数.D的范围是0~30.MySQL要求D小于或等于(<=)P. DECIMAL(P,D)表示列可以存储D位小数的P位数.十进制列的实际范围取决于精度和刻度. 与IN

  • MySQL 数据类型选择原则

    小而美 通常来说,尽可能使用占用存储空间小的数据类型来存储数据.这类数据类型通常也会更快,并且占用的磁盘空间.内存乃至缓存都更小,而且占用的 CPU 处理周期也少. 但是,务必准确估计要存储的数据值的范围.因为在数据表结构的多个地方扩充数据范围会是一个痛苦且耗时的过程.如果在犹豫哪种数据类型合适,那就选择你认为不会超出范围的最小空间的类型(在系统早期或者数据表 数据不多的情况下也可以进行调整). 简单至上 数据类型越简单意味着处理数据的 CPU 周期越少.例如,整型相比字符型而言,处理起来更容易

  • 详解MySQL数据类型DECIMAL(N,M)中N和M分别表示的含义

    同事问MySQL数据类型DECIMAL(N,M)中N和M分别表示什么含义,M不用说,显然是小数点后的小数位数,但这个N究竟是小数点之前的最大位数,还是加上小数部分后的最大位数?这个还真记不清了.于是乎,创建测试表验证了一番,结果如下: 测试表,seller_cost字段定义为decimal(14,2) CREATE TABLE `test_decimal` ( `id` int(11) NOT NULL, `seller_cost` decimal(14,2) DEFAULT NULL ) EN

  • MySQL数据类型中DECIMAL的用法实例详解

    MySQL数据类型中DECIMAL的用法实例详解 在MySQL数据类型中,例如INT,FLOAT,DOUBLE,CHAR,DECIMAL等,它们都有各自的作用,下面我们就主要来介绍一下MySQL数据类型中的DECIMAL类型的作用和用法. 一般赋予浮点列的值被四舍五入到这个列所指定的十进制数.如果在一个FLOAT(8, 1)的列中存储1. 2 3 4 5 6,则结果为1. 2.如果将相同的值存入FLOAT(8, 4) 的列中,则结果为1. 2 3 4 6. 这表示应该定义具有足够位数的浮点列以便

  • Java数据类型与MySql数据类型对照表

    本文讲述了Java数据类型与MySql数据类型对照表.分享给大家供大家参考,具体如下: 类型名称 显示长度 数据库类型 JAVA类型 JDBC类型索引(int) VARCHAR L+N VARCHAR java.lang.String 12 CHAR N CHAR java.lang.String 1 BLOB L+N BLOB java.lang.byte[] -4 TEXT 65535 VARCHAR java.lang.String -1 INTEGER 4 INTEGER UNSIGNE

随机推荐