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

news2024/11/29 22:38:18

前言

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

  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)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

硬件知识积累 共模电感的介绍

1. 基础知识了解 1. 共模电流(Common Mode Current): 解释1:共模电流是不存在传导或有线回流通路的高频电流,共模电流与位移电流(传导线路周边变化的电场)一同组成环路实现电流闭合。 解释2: 共模电流是指通过电路的两…

GD32单片机远程升级下载,手机在线升级下载程序,GD32在线固件下载升级,手机下载程序固件方法

GD32、STM32单片机,是我们最常见的一种MCU。通常我们在使用STM32单片机都会遇到程序在线升级下载的问题。 GD32/STM32单片机的在线下载通常需要以下几种方式完成: 1、使用ST/GD提供的串口下载工具,本地完成固件的升级下载。 2、自行完成系统B…

自定义拖拽列表

效果图 DataAnalysis.vue <template><div class"app-container"><div class"operate"><el-select class"t_select" v-model"templateName" clearable placeholder"模版" size"default" cle…

电脑监控软件安装教程(30秒钟教会你快速安装)

在现代化办公中&#xff0c;如果有需要安装电脑监控软件的可以参考下面这篇文章&#xff1a; 一、准备阶段 可以自行到官网获取安装包&#xff0c;比如去域之盾官网&#xff0c;即可通过客服获取试用包。 二、操作阶段 1、这个就是安装包&#xff0c;点击运行。 2、这个是正…

Postgresql数据类型-数字类型

PostgreSQL支持的数字类型有整数类型、用户指定精度类型、浮点类型、serial类型。 PostgreSQL支持的数字类型如表所示 smallint、integer、bigint都是整数类型&#xff0c;存储一定范围的整数&#xff0c;超出范围将会报错。smallint存储2字节整数&#xff0c;字段定义时可写成…

大模型使用技巧

目录 1、文心一言&#xff1a;https://yiyan.baidu.com/ 2、智谱清言 ChatGLM&#xff1a;https://chatglm.cn/ 3、百川智能&#xff1a;https://www.baichuan-ai.com/ 4、科大讯飞星火大模型&#xff1a;https://xinghuo.xfyun.cn 5、字节跳动 AI 豆包 https://www.do…

idea2023 PoJie以后无法修改内存无效,heap内存设置

1. 打开电脑环境变量 2. 找到对应pojie文件 vmoptions目录 3. 修改这个文件 添加或者修改配置 -Xms128m -Xmx8192m4. 重启idea 修改成功

史上最全,从初级测试到高级测试开发面试题汇总,冲击大厂年50w+

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 接口测试面试相关…

考研408-计算机网络 第一章-计算机网络体系结构学习笔记及习题

第一章 计算机网络体系结构 一 计算机网络概述 1.1 概念及功能 1.1.1 计算机网络的概念 计算机网络就是互连的、自治的计算机系统的集合 互连&#xff1a;通过通信链路互联互通 自治&#xff1a;各个节点之间无主从关系&#xff0c;高度自治的 1.1.2 计算机网络的功能 功…

通过51单片机控制SG90舵机按角度正反转转动

一、前言 本文介绍如何通过51单片机控制SG90舵机实现角度的正反转转动。SG90舵机是一种常用的微型舵机&#xff0c;具有体积小、重量轻、结构简单等特点&#xff0c;被广泛应用于机器人、遥控模型和各种自动控制系统中。 使用51单片机&#xff08;STC89C52&#xff09;作为控…

公开IP属地信息如何保护用户的隐私?

公开IP属地信息通常涉及与用户或组织的隐私有关&#xff0c;因此在公开此类信息时需要非常小心&#xff0c;以避免侵犯他人的隐私权。以下是触碰底线的几种情况以及如何保护网络安全和用户隐私&#xff1a; 个人隐私保护&#xff1a; 公开IP属地信息可能泄露用户的物理位置&…

5虚拟局域网构建

前面简单介绍了使用交换机连接不同的服务器&#xff0c;这次我们看看怎么搞虚拟局域网。 虚拟局域网&#xff0c;也被称为VLAN&#xff08;Virtual Local Area Network&#xff09;&#xff0c;是一个网络的划分概念&#xff0c;使得一组网络设备可以表现得像在同一个物理网络…

大家都在用的数据安全运维管理系统是哪家?有什么功能?

随着数字化大力发展&#xff0c;越来越多的企业开始重视数据安全&#xff0c;开始采购数据安全运维管理系统。但面对市面上多个品牌的数据安全运维管理系统&#xff0c;企业采购时候往往是蒙圈的。因此不少负责人在问&#xff0c;大家都在用的数据安全运维管理系统是哪家&#…

时间序列预测模型实战案例(八)(Informer)个人数据集、详细参数、代码实战讲解

论文地址->Informer论文地址PDF点击即可阅读 代码地址-> 论文官方代码地址点击即可跳转下载GIthub链接 本文介绍 本篇博客带大家看的是Informer模型进行时间序列预测的实战案例&#xff0c;它是在2019年被提出并在ICLR 2020上被评为Best Paper&#xff0c;可以说Inform…

麒麟操作系统登录双因素认证方案 安当加密

麒麟操作系统安全登录方案可以采取以下几种方式&#xff1a; 账户密码认证&#xff1a;用户登录时需要输入正确的账户和密码&#xff0c;账户和密码是用户登录系统的必要条件。为了保证账户和密码的安全性&#xff0c;可以采用加密算法对密码进行加密存储&#xff0c;并且限制…

CTF工具音频隐写神器MP3stego安装和详细使用方法

音频隐写MP3stego安装和详细使用方法 1.MP3stego介绍&#xff1a;2.MP3stego下载安装&#xff1a;3.MP3stego使用教程&#xff1a;4.MP3stego使用案例&#xff1a;5.MP3stego总结&#xff1a; 1.MP3stego介绍&#xff1a; MP3stego是一个在通用的MP3音频文件中隐写的软件&…

1. Collection,List, Map, Queue

1. java集合框架体系结构图 2. Collection派生的子接口 其中最重要的子接口是&#xff1a; 1&#xff09;List 表示有序可重复列表&#xff0c;重要的实现类有&#xff1a;ArrayList, LinkedList ArrayList特点&#xff1a;底层数组实现&#xff0c;随机查找快&#xff0c;增删…

【FastCAE源码阅读4】VTK OrientationMarkerWidget方向标记组件的使用

FastCAE前处理窗口有个方向指示的组件&#xff0c;会跟踪场景进行旋转&#xff0c;这种设计在很多三维软件都有类似的设计&#xff0c;效果如下图&#xff1a; FastCAE采用的是VTK自带的vtkOrientationMarkerWidget实现的&#xff0c;具体代码如下&#xff1a; void Graph3D…

Springboot在线考试系统 毕业设计-附源码82626

Springboot在线考试系统 摘 要 信息化社会内需要与之针对性的信息获取途径&#xff0c;但是途径的扩展基本上为人们所努力的方向&#xff0c;由于站在的角度存在偏差&#xff0c;人们经常能够获得不同类型信息&#xff0c;这也是技术最为难以攻克的课题。针对在线考试等问题&am…

基于Pytorch框架的LSTM算法(一)——单维度单步滚动预测(2)

#项目说明&#xff1a; 说明&#xff1a;1time_steps滚动预测代码 y_norm scaler.fit_transform(y.reshape(-1, 1)) y_norm torch.FloatTensor(y_norm).view(-1)# 重新预测 window_size 12 future 12 L len(y)首先对模型进行训练&#xff1b; 然后选择所有数据的后wind…