建表时如何合理选择字段类型

前言

我们在建表的时候关于字段类型的选择会有这么几类人:

  1. 严谨型
    严格调研每个字段可能的大小,然后根据不同字段类型的限制,进行选择,这一类人在创建关系型数据表的时候是没有问题的。
  2. 图自己省事型
    把所有字段都设置为String,这样他可以一股脑的把所有数据导入进来。这种人在用关系型数据库(如mysql)的时候,会被骂死,在大数据(如hive)中,可能ODS层这么搞,原则上是可行,毕竟还有建模的时候可以处理这些数据类型,但是建模的人也会抱怨。
  3. 根据不同场景进行甄别型
    (1)大数据领域
    由于大数据字段类型差异带来性能影响远远无法和数据量相提并论,因此不需要那么严谨。
    (2)关系型数据库
    需要尽可能给用户带来极致的体验,字段类型尽可能要选择合理。

常用的字段类型

数据类型描述
TINYINT1-byte signed integer, from -128 to 127
SMALLINT2-byte signed integer, from -32,768 to 32,767
INT/INTEGER4-byte signed integer, from -2,147,483,648 to 2,147,483,647
BIGINT8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
FLOAT4-byte single precision floating point number
DOUBLE8-byte double precision floating point number
DECIMALHive中的DECIMAL类型基于Java的BigDecimal,用于在Java中表示不可变的任意精度十进制数。所有常规的数值操作(例如+、-、*、/)和相关的UDF(例如Floor、Ceil、Round等)都可以处理DECIMAL类型。您可以像处理其他数值类型一样,对DECIMAL类型进行类型转换。DECIMAL类型的持久化格式同时支持科学计数法和非科学计数法。因此,无论您的数据集包含类似4.004E+3(科学计数法)还是4004(非科学计数法)或两者的组合的数据,都可以使用DECIMAL来处理。
STRING字符串,变长,字符串文字可以用单引号(')或双引号(“)表示
VARCHARVarchar类型在创建时需要指定长度(在1到65535之间),它定义了字符字符串中允许的最大字符数。如果转换/分配给varchar值的字符串值超过了长度指定值,那么该字符串将被静默截断
CHAR字符类型(Char types)与Varchar类似,但它们的长度是固定的,这意味着短于指定长度值的值会用空格填充,但在比较时尾部空格并不重要。最大长度固定在255
TIMESTAMP支持具有可选纳秒精度的传统UNIX时间戳
DATEDATE值描述特定的年/月/日,格式为YYYY-MM-DD。例如,日期为“2013年01月01日”。日期类型没有一天中的时间组件。Date类型支持的值范围为0000-01-01到9999-12-31,这取决于原始Java Date类型的支持
BOOLEANtrue/false
INTERVAL时间频率间隔
ARRAY有序的的同类型的集合
MAPkey-value,key必须为原始类型,value可以任意类型
STRUCT字段集合,类型可以不同
UNION在有限取值范围内的一个值

大数据(Hive)字段类型选择

数据仓库Hive中的字段长度尽量满足相应源系统字段中最大长度的要求,当然也会考虑字段的业务含义,对于一些源系统定义过长,而从实际业务含义又不可能有那么长的字段,由仓库自行选择一个合适的长度定义;为了尽可能的保持仓库中数据类型的一致性以及规范性,数据仓库中的数据类型定义不宜过杂,建议只定义string、bigint、double类型,使得仓库中的字段类型保持整齐。

关系型数据库(Mysql)字段类型选择

  1. 原则
    尽可能选择合适的类型。比如某个字段只有0和1,那么绝对是tinyint优先于int。
  2. tinyint和int性能
  • 存储空间
    INT字段占用4个字节,而TINYINT字段只占用1个字节。因此,如果你的数据量较大,使用TINYINT可以节省存储空间,减少磁盘IO的开销。
  • 内存消耗
    INT字段存储时会占用更多的内存空间,如果表中有很多INT字段,并且数据量较大,会增加MySQL服务器的内存消耗。
  • 索引效率
    使用TINYINT字段来创建索引会比使用INT字段创建索引效率更高。因为在索引建立和查询过程中,TINYINT占用的空间小,可以减少IO操作次数,提高查询效率。
  • 运算和比较速度
    INT字段相较于TINYINT字段在运算和比较操作上可能稍微慢一些,因为需要处理更多的字节。

如果你的数据范围可以在TINYINT的取值范围内(-128到127或0到255),并且对存储空间和索引效率有较高的要求,使用TINYINT字段会更合适。如果数据范围超出了TINYINT的取值范围,或者对于内存消耗和运算速度要求更高,可以考虑使用INT字段。

  1. int(1)和int(10)有什么区别
    INT(1)和INT(10)实际上并没有区别。在MySQL中,当定义整数类型(如INT)时,括号中的数字表示显示宽度,而不是存储大小或值的范围。
    显示宽度只影响在查询结果集中显示的值的宽度。例如,如果你使用INT(10),并在查询结果中有一个值为123,那么它仍然会显示为123,而不是用前导零填充到10位。显示宽度不会限制值的范围或存储大小。
    实际上,对于整数类型,如INT,存储大小和值的范围是由类型本身确定的,而不是显示宽度。INT类型总是使用4个字节(32位)的存储空间,并且值的范围始终是从-2147483648到2147483647(有符号)或从0到4294967295(无符号)。
    因此,无论使用INT(1)还是INT(10),它们的存储大小和值的范围都是相同的。选择适当的显示宽度只是为了在查询结果中更好地格式化显示的值。
    总结起来,INT(1)和INT(10)在MySQL 8中没有实际的区别,它们只是用于指定查询结果中显示的值的宽度。
    为了更加直观的理解:
  • 建一张表:

    create table intVsIntAnyThingDemo
    (
        Number1 int(1) unsigned zerofill,
        Number  int(8) unsigned zerofill
    );
    

    建表语句详解:
    在MySQL中,unsigned 和 zerofill 是两种属性,它们可以用来修饰整数类型(如 int)。
    unsigned: 表示该字段只能存储非负整数。也就是说,这个字段不能存储负数。
    zerofill: 表示如果值的位数小于指定的整数位数,那么在这个值的左侧填充零。
    对于字段 Number1 int(1) unsigned zerofill,由于指定了int(1),这意味着这个字段只能显示一位数字。但由于使用了unsigned zerofill,当你插入一个数字时,它会自动被填充为两位数。例如,插入5会变成05。
    对于字段 Number int(8) unsigned zerofill,它可以显示8位数字。所以,插入42会变成00000042。
    总结:在这个例子中,unsigned确保了字段只存储非负数,而zerofill确保字段在显示时,如果实际数字位数小于指定的位数,那么会在左侧填充零。但需要注意的是,尽管显示上似乎Number1只能存储0到9的数字,但实际上由于其unsigned属性,它可以存储从0到255的整数值。这是因为int(1)在无符号的情况下,仍然按照整数的底层存储来对待,其范围是0到255。

  • 插入数据

insert into intVsIntAnyThingDemo values(11,22);
  • 查看数据
    在这里插入图片描述

参考文档

Hive数据类型
stackoverflow
int(5)vsint(10)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/128896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

100 寻找重复数

寻找重复数 题解1 二分法题解2 快慢指针(同环形链表2(ab)(ab)kL) 给定一个包含 n 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 ,返…

使用Pytorch的一些小细节(一)

文章目录 前言数据结构-张量max函数索引函数赋值函数拼接函数 前言 由于不经常动手写代码,所以对于python语言中的常见数据结构的用法也不是很熟悉,对于pytorch中的数据结构就更加不熟悉了。之前的代码基础是基于C语言的,属性都是自己定义&a…

动态规划-构建乘积数组

** 描述 给定一个数组 A[0,1,…,n-1] ,请构建一个数组 B[0,1,…,n-1] ,其中 B 的元素 B[i]A[0]A[1]…*A[i-1]A[i1]…*A[n-1](除 A[i] 以外的全部元素的的乘积)。程序中不能使用除法。(注意:规定 B[0] A[1] * A[2] * … * A[n-1…

量子计算和量子通信技术:引领潜力无限的未来

近年来,随着量子计算和量子通信技术的迅速发展,它们在各个领域的广泛应用前景引起了人们的极大兴趣。本文将深入探讨量子计算和量子通信技术的普遍应用,以及它们预示的未来,同时提出业内人士需要注意的事项。 介绍:量子…

【Spring之底层核心架构概念解析】

文章目录 一、BeanDefinition二、BeanDefinitionReader2.1、AnnotatedBeanDefinitionReader2.2、XmlBeanDefinitionReader 五、ClassPathBeanDefinitionScanner六、BeanFactory七、ApplicationContext7.1、AnnotationConfigApplicationContext7.2、ClassPathXmlApplicationCont…

E云管家个微协议框架--新版本的利器

在互联网时代,高效、可靠的互联网协议对于实现稳定、安全的数据传输至关重要。E云管家作为一项创新性的IPAD协议构建工具,基于IPAD8.0.37协议为开发者提供了强大而灵活的功能,使他们能够轻松构建高效的通信协议。本文将介绍E云管家的主要特点…

python3.8及以上版本绑定gdal库的一个注意事项

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> gdal和python绑定参考文章:windows环境下python和gdal绑定方法   值得注意的是绑定python3.8及以上版本后在python程序中初始化gdal库时会出…

“三门问题”解决方案:换不换?更换策略与贝叶斯策略?附 Java 验证代码

文章目录 前言一、什么是“三门问题”?二、“三门问题”解决策略详解2.1、错误策略:直觉策略与随机策略2.2、更换策略与事件分析计算2.3、贝叶斯策略及分析流程 三、Java 语言验证“三门问题”总结 前言 “三门问题”作为一道经典逻辑推理题,…

【Linux】Linux常用命令—用户管理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

《QT从基础到进阶·二十》QThreadPool线程池的使用

什么情况下比较适合用线程池&#xff1f; 比如我有上百个任务要同时处理&#xff0c;难道开上百个线程&#xff1f;NO&#xff01;&#xff01;&#xff01; 有了线程池的加持&#xff0c;自动给任务分配线程处理&#xff0c; 多线程不再是真爱~ 线程池创建&#xff1a; 1、自…

【带头学C++】----- 四、动态内存空间申请 ---- 4.1 动态内存分配

1.动态内存分配概述 在C和C等语言中&#xff0c;可以使用malloc、calloc、realloc或使用new等函数来动态分配内存空间&#xff0c;同时使用free、delete函数释放动态分配的内存空间&#xff0c;这样可以根据程序的实际需要动态管理内存&#xff0c;避免静态内存分配的局限性。 …

微信超实用的小功能

微信真的有超多实用小功能 平时很少注意到&#xff0c;每次都用传统的方法解决&#xff0c;浪费人家研发人员的一片苦心~ 1重要事项提醒&#xff1a;健忘症的福音&#xff1b; 步骤&#xff1a;长按消息-提醒-设置。 2 图片翻译&#xff1a;不用跳转翻译软件&#xff0c;一键翻…

什么是自动化测试框架?我们该如何搭建自动化测试框架?

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。之前学习自动化测试的过程中&#xff0c;一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上自己的一些实践&#xff0c;算是对“框架”…

数据分析-numpy

numpy numpy numpy简介优点下载ndarray的属性输出数据类型routines 函数ndarray对象的读写操作ndarray的级联和切分级联切分 ndarray的基本运算广播机制&#xff08;Broadcast&#xff09;ndarry的聚合操作数组元素的操作numpy 数学函数numpy 查找和排序 写在最后面 简介 nump…

js 变量声明与赋值 笔试踩坑题

文章目录 概述函数声明函数形参与实参函数预编译用一个例子说明一下&#xff0c;这四个步骤分别要干些什么。重复四个步骤&#xff0c;反复练习一下 全局编译多重执行期上下文 概述 别小看变量声明与赋值&#xff0c;在所有的笔试中&#xff0c;基本都会考&#xff0c;这个要多…

LeetCode刷题总结(一)

文章目录 前言题型排序问题动态规划 前言 本文把刷题过程中的总结记下来&#xff0c;方便未来回顾的时候继续拓展。 题型 排序问题 排序问题的解决方法有很多。对于简单算法来说&#xff0c;最重要的是记住思路&#xff1b;对于高级算法来说&#xff0c;最重要的是记住细节…

asp.net core weapi 结合identity完成登录注册

1.安装所需要的nuget包 <PackageReference Include"Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version"6.0.24" /><PackageReference Include"Microsoft.EntityFrameworkCore" Version"6.0.24" /><PackageR…

工作利器!熟悉这几款数据流图工具,事半功倍!

数据流图工具在现代工作中起到了非常重要的作用。无论是在企业内部的流程优化&#xff0c;还是在软件开发、项目管理、系统设计等领域&#xff0c;数据流图工具都扮演着关键的角色。本文将为大家介绍8款高效的数据流图工具&#xff0c;帮助大家选择适合自己工作需求的工具。 1.…

创建Springboot工程

前期准备 查看是否安装Java;javac命令是否可用; java -version javac 都安装好之后可以进行创建。 步骤 此处我是使用IntelliJ IDEA 进行创建 打开新建项目–选择Spring Initializr 服务器URL&#xff1a;可以使用默认 &#xff0c; 如果感觉太慢可以选择 http://start.a…

原厂监视综合控制继电器 ZZS-7/1 AC220V 凸出端子固定安装

ZZS-7/11分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/12分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/13分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/14分闸、合闸、电源监视综合控制装置&#xff1b; ZZS-7/102分闸、合闸、电源监视综合控制装置…