建表时如何合理选择字段类型
前言
我们在建表的时候关于字段类型的选择会有这么几类人:
- 严谨型
严格调研每个字段可能的大小,然后根据不同字段类型的限制,进行选择,这一类人在创建关系型数据表的时候是没有问题的。 - 图自己省事型
把所有字段都设置为String,这样他可以一股脑的把所有数据导入进来。这种人在用关系型数据库(如mysql)的时候,会被骂死,在大数据(如hive)中,可能ODS层这么搞,原则上是可行,毕竟还有建模的时候可以处理这些数据类型,但是建模的人也会抱怨。 - 根据不同场景进行甄别型
(1)大数据领域
由于大数据字段类型差异带来性能影响远远无法和数据量相提并论,因此不需要那么严谨。
(2)关系型数据库
需要尽可能给用户带来极致的体验,字段类型尽可能要选择合理。
常用的字段类型
| 数据类型 | 描述 |
|---|---|
| TINYINT | 1-byte signed integer, from -128 to 127 |
| SMALLINT | 2-byte signed integer, from -32,768 to 32,767 |
| INT/INTEGER | 4-byte signed integer, from -2,147,483,648 to 2,147,483,647 |
| BIGINT | 8-byte signed integer, from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 |
| FLOAT | 4-byte single precision floating point number |
| DOUBLE | 8-byte double precision floating point number |
| DECIMAL | Hive中的DECIMAL类型基于Java的BigDecimal,用于在Java中表示不可变的任意精度十进制数。所有常规的数值操作(例如+、-、*、/)和相关的UDF(例如Floor、Ceil、Round等)都可以处理DECIMAL类型。您可以像处理其他数值类型一样,对DECIMAL类型进行类型转换。DECIMAL类型的持久化格式同时支持科学计数法和非科学计数法。因此,无论您的数据集包含类似4.004E+3(科学计数法)还是4004(非科学计数法)或两者的组合的数据,都可以使用DECIMAL来处理。 |
| STRING | 字符串,变长,字符串文字可以用单引号(')或双引号(“)表示 |
| VARCHAR | Varchar类型在创建时需要指定长度(在1到65535之间),它定义了字符字符串中允许的最大字符数。如果转换/分配给varchar值的字符串值超过了长度指定值,那么该字符串将被静默截断 |
| CHAR | 字符类型(Char types)与Varchar类似,但它们的长度是固定的,这意味着短于指定长度值的值会用空格填充,但在比较时尾部空格并不重要。最大长度固定在255 |
| TIMESTAMP | 支持具有可选纳秒精度的传统UNIX时间戳 |
| DATE | DATE值描述特定的年/月/日,格式为YYYY-MM-DD。例如,日期为“2013年01月01日”。日期类型没有一天中的时间组件。Date类型支持的值范围为0000-01-01到9999-12-31,这取决于原始Java Date类型的支持 |
| BOOLEAN | true/false |
| INTERVAL | 时间频率间隔 |
| ARRAY | 有序的的同类型的集合 |
| MAP | key-value,key必须为原始类型,value可以任意类型 |
| STRUCT | 字段集合,类型可以不同 |
| UNION | 在有限取值范围内的一个值 |
大数据(Hive)字段类型选择
数据仓库Hive中的字段长度尽量满足相应源系统字段中最大长度的要求,当然也会考虑字段的业务含义,对于一些源系统定义过长,而从实际业务含义又不可能有那么长的字段,由仓库自行选择一个合适的长度定义;为了尽可能的保持仓库中数据类型的一致性以及规范性,数据仓库中的数据类型定义不宜过杂,建议只定义string、bigint、double类型,使得仓库中的字段类型保持整齐。
关系型数据库(Mysql)字段类型选择
- 原则
尽可能选择合适的类型。比如某个字段只有0和1,那么绝对是tinyint优先于int。 - 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字段。
- 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)
相关文章:
建表时如何合理选择字段类型
前言 我们在建表的时候关于字段类型的选择会有这么几类人: 严谨型 严格调研每个字段可能的大小,然后根据不同字段类型的限制,进行选择,这一类人在创建关系型数据表的时候是没有问题的。图自己省事型 把所有字段都设置为String&a…...
Qt Creator插件
这里以Qt Creator 4.15.2版本的源码为示例进行分析 源码结构如下,为了追溯其插件加载过程,从main.cpp入手 Qt Creator的插件目录,生成的插件,好几十个呢 Qt Creator插件的读取 int main(int argc, char **argv)中以下代码创建插…...
AI全栈大模型工程师(十九)Semantic Kernel
文章目录 Semantic KernelSK 的开发进展SK 的生态位SK 基础架构后记 Semantic Kernel 先比较下 Semantic Kernel 和 LangChain。 Semantic KernelLangChain出品公司微软LangChain AI支持语言Python、C#、Java、TypeScriptPython、TypeScript开源协议MITMIT被应用在Microsoft …...
Dubbo 的服务请求失败怎么处理?
本文引用mic老师面试文档 今天分享的面试题,几乎是 90%以上的互联网公司都会问到的问题。 “Dubbo 的服务请求失败怎么处理”? 对于这个问题,我们来看一下普通人和高手的回答。 普通人 嗯… 我记得, Dubbo 请求处理失败以后&a…...
存储虚拟化讲解
目录 存储虚拟化的分类 按照虚拟化发生的位置分类 基于主机的虚拟化 基于存储设备的虚拟化 基于网络的虚拟化 按照虚拟化实现方式分类 带内虚拟化 带外虚拟化 按照虚拟化的对象分类 虚拟机磁盘类型 按照磁盘的特性分类 按照磁盘的安全性分类 什么是虚拟化 存储虚拟…...
[云原生案例2.1 ] Kubernetes的部署安装 【单master集群架构 ---- (二进制安装部署)】节点部分
文章目录 1. 常见的K8S安装部署方式1.1 Minikube1.2 Kubeadm1.3 二进制安装部署 2. Kubernetes单master集群架构 ---- (二进制安装部署)2.1 前置准备2.2 操作系统初始化2.3 部署 docker引擎 ---- (所有 node 节点)2.4 部署 etcd 集…...
Apache ActiveMQ 远程代码执行漏洞影响范围
漏洞相关信息 项目内容漏洞名称Apache ActiveMQ 远程代码执行漏洞 漏洞描述 组件名称:Apache ActiveMQ 漏洞类型:远程代码执行 利用条件: 1、用户认证:不需要用户认证 2、触发方式:网络可访问 ActiveMQ的61616端…...
如何规划并新建大数据平台的独立生产域?5步走
一般来说,大数据平台包括以下4类数据生产域——生产生态环境(正式生产环境)、开发和测试环境、培训和演示环境、灾备环境。各生产域在由平台提供资源、安全、监控、故障恢复等保障的同时,不同的生产域之间还需要严格隔离ÿ…...
工程车云管家|叉车智能管家安卓主板方案
工程车云管家是一款功能强大的设备管理和调度系统,它可以实时追踪工程车或机械设备的地理位置、视频、行驶轨迹、油位油耗、工作时长和地点、以及运行状况等信息,并将这些数据通过云平台存储、分析,并发送到管理者的手机上。这使得管理者能够…...
大数据学习之Spark性能优化
文章目录 Spark三种任务提交模式宽依赖和窄依赖StageSpark Job的三种提交模式 Shuffle机制分析未优化的Hash Based Shuffle优化后的Hash Based ShuffleSort-Based Shuffle Spark之checkpointcheckpoint概述checkpoint与持久化的区别checkPoint的使用checkpoint源码分析 Spark程…...
个人服务器到期,项目下线,新的开始
告别旧服务器 2023.11.06服务器到期,所有项目正式下线 时间真的过的很快,从开始踏入编程的大门,到现在不知不觉已经陆续经手了两台服务器了,目前这台服务器是一年前的阿里云活动白嫖的嘿嘿嘿,该服务器上目前运行的项…...
arcgis 网络分析 生成可达范围/等时线
需求:生成从地铁站步行10分钟可达的范围面图层。 线图层预处理 在精度要求不是很高的情况下,可采用OSM路网,从中剔除不允许步行的道路类型:高速公路、快速路。 在路网图层中新增一个字段“步行时间”,用字段计算器&…...
npm切换镜像源
一,切换 npm 镜像源 npm 存储包文件的服务器在国外,速度很慢,所以我们需要解决这个问题。 国内淘宝的开发团队把 npm 在国内做了一个备份,网址是:http://npm.taobao.org/。 # 查看当前的源 npm config ls # 在上面命令…...
Python简单学习
Python List # python 列表可以加入所有类型 如列表,字典,数字,字符串等bicycles [trek, cannondale, redline, specialized] print(bicycles)# 访问列表元素,使用索引 print(bicycles[0])# 访问最后一个元素下标-1. 以此类推 p…...
2000-2021年全国各省资本存量测算数据(含原始数据+测算过程+计算结果)
2000-2021年全国各省资本存量测算数据(含原始数据测算过程计算结果) 1、时间:2000-2021年(以2000年为基期) 2、范围:30个省市(不含西藏) 3、指标:固定资产形成总额、固…...
Vue.js 中的异步组件是什么?
在 Vue.js 中,异步组件是一种延迟加载组件的方式。允许将组件的加载推迟到组件真正需要被渲染时再进行,而不是在初始化时立即加载所有组件。 通过使用异步组件,可以提高应用的初始加载速度,尤其是当应用包含大量组件时。只有当组…...
Luckysheet 实现excel多人在线协同编辑
前言 前些天看到Luckysheet支持协同编辑Excel,正符合我们协同项目的一部分,故而想进一步完善协同文章,但是遇到了一下困难,特此做声明哈,若侵权,请联系我删除文章! 若侵犯版权、个人隐私&#x…...
C++线程库的基本使用(初级)
#include<iostream> #include<thread> #include<string> void printHelloWorld(std::string msg) {std::cout << msg<< std::endl;return; } int main() {std::thread threadl(printHelloWorld,"Hello Thread");//第一个参数是函数名&…...
2023最新版JavaSE教程——第1天:Java语言概述
目录 一、抽丝剥茧话Java1.1 当前大学生就业形势1.2 IT互联网是否依旧靠谱1.3 IT行业岗位分析1.4 软件开发之Java开发1.5 到底多少人在用Java 二、计算机的硬件与软件2.1 计算机组成:硬件软件2.2 CPU、内存与硬盘2.3 输入设备:键盘输入 三、软件相关介绍…...
PTL货位指引标签为仓储管理打开新思路
PTL货位指引标签是一种新型的仓储管理技术,它通过LED灯光指引和数字显示,为仓库管理带来了全新的管理思路和效率提升,成为现代物流仓库管理中的重要工具。 首先,PTL货位指引标签为仓储管理业务带来了管理新思路。传统的仓库管理中…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
