五种主流数据库:常用数据类型

在设计数据库的表结构时,我们需要明确表中包含哪些字段以及字段的数据类型。字段的数据类型定义了该字段能够存储的数据种类以及支持的操作。

本文将会介绍五种主流数据库中常用的数据类型以及如何选择合适的数据类型,包括 MySQL、Oracle、SQL Server、PostgreSQL 以及 SQLite。常见的 SQL 数据类型包括数字类型、字符串类型、日期时间类型以及二进制类型。

数据类型MySQLOracleSQL ServerPostgreSQLSQLite
精确数字TINYINT
SMALLINT
MEDIUMINT
INTEGER
BIGINT
NUMERIC
SMALLINT
INTEGER
NUMERIC
SMALLINT
MEDIUMINT
INTEGER
BIGINT
NUMERIC
SMALLINT
MEDIUMINT
INTEGER
BIGINT
NUMERIC
动态类型
近似数字FLOAT
DOUBLE PRECISION
BINARY_FLOAT
BINARY_DOUBLE
REAL
DOUBLE PRECISION
REAL
DOUBLE PRECISION
动态类型
定长字符串CHARCHARCHARCHAR动态类型
变长字符串VARCHARVARCHAR2VARCHARVARCHAR动态类型
字符串大对象TEXTCLOBVARCHAR(MAX)TEXT动态类型
日期DATEDATEDATEDATE动态类型
时间TIME--TIMETIME动态类型
时间戳TIMESTAMPTIMESTAMPDATETIME2TIMESTAMP动态类型
二进制BINARY
VARBINARY
BLOB
BLOBBINARY
VARBINARY
BYTEA动态类型

注意:SQLite 默认使用动态类型,字段的数据类型由实际存储的内容而不是定义时的数据类型决定。例如,我们可以将某个字段定义为整数类型,然后用于存储字符串数据。另外,SQLite 3.37.0 开始支持严格(STRICT)的数据类型。

数字类型

数字类型主要分为两类:精确数字和近似数字。4 种主流数据库对于常用数字类型的支持如下表所示。

在这里插入图片描述

提示:SQLite 默认使用动态数据类型,任何类型都可以存储数字。如果使用了严格(STRICT)的数据类型,可以使用 INTEGER 或者 ANY 类型存储整数,使用 REAL 或者 ANY 类型存储单精度浮点数。

精确数字

精确数字类型用于存储整数或者包含固定小数位的数字。其中,SMALLINT、INTEGER 和 BIGINT 都可以表示整数。另外,INT 是 INTEGER 的同义词。

Oracle 中的 SMALLINT 和 INTEGER 都是 NUMBER(38, 0) 的同义词,其不支持 BIGINT 类型。

MySQL、Microsoft SQL Server 以及 PostgreSQL 中的 SMALLINT 类型支持的整数范围为-215~215-1,INTEGER 支持的整数范围为-231~231-1,BIGINT 支持的整数范围为-263~263-1。

MySQL 还支持 TINYINT 和 MEDIUMINT 两种整数类型。另外,MySQL 中的所有数字类型都分为有符号类型(INTEGER、INTEGER SIGNED 等)和无符号类型(INTEGER UNSIGNED等),无符号整型支持的正整数范围(0~232-1)比有符号整型扩大了一倍。

NUMERIC(p, s)用于存储包含小数的精确数字。其中精度 p 表示总的有效位数,刻度 s 表示小数点后允许的位数。例如,123.04 的精度为 5,刻度为 2。

p 和 s 都是可选的参数,s 为 0 表示整数。SQL 标准要求 p 大于或等于 s,s 大于或等于 0,并且 p 大于 0。

另外,DECIMAL 和 DEC 都是 NUMERIC 的同义词。Oracle 中的 NUMERIC 和 DECIMAL都是 NUMBER 的同义词。

整数类型通常用于存储数字编号、产品数量、课程得分等数字。NUMERIC(p, s) 类型通常用于存储产品价格、销售金额等包含小数并且准确度要求高的数字。

近似数字

近似数字也被称为浮点型数字,一般较少使用,主要用于科学计算领域。浮点数的运算比普通数字类型更快,但是其可能丢失精度,从而导致非预期的结果。

其中,REAL 表示单精度浮点数,通常精确到小数点后 6 位。DOUBLE PRECISION 表示双精度浮点数,通常精确到小数点后 15 位。

Oracle 使用 BINARY_FLOAT 和 BINARY_DOUBLE 表示浮点型数字。

MySQL 使用 FLOAT 表示单精度浮点型数字,同时区分有符号浮点数(FLOAT)和无符号浮点数(FLOAT UNSIGNED)。

字符串类型

字符串类型用于存储文本数据,主要包含 3 种具体的类型:定长字符串、变长字符串以及字符串大对象。4 种主流数据库对于常用字符串类型的支持如下表所示。

在这里插入图片描述

提示:SQLite 默认使用动态数据类型,任何类型都可以存储字符串。如果使用了严格(STRICT)的数据类型,可以使用 TEXT 或者 ANY 类型存储字符串。

定长字符串

CHAR(n) 表示长度固定的字符串,其中 n 表示字符串的长度。CHARACTER 和 CHAR 是同义词。定长字符串数据类型的常见定义方式如下:

  • CHAR,表示长度为 1 的字符串,只能存储 1 个字符。
  • CHAR(5),表示长度为 5 的字符串。

对于定长字符串类型,如果输入的字符串长度不够,数据库将会使用空格进行填充。例如,对于数据类型为 CHAR(5)的字段,如果输入值为“A”,实际存储的内容为“A ”,也就是一个字符“A”加上 4 个空格。当我们在查询条件中使用这种字段的值进行比较时,数据库会将字符串右侧的空格截断后再参与比较。

通常只有存储固定长度的字符串时我们才需要考虑使用定长字符串类型,比如 18 位身份证号或者 6 位邮政编码等。

变长字符串

VARCHAR(n) 表示长度不固定的字符串,其中 n 表示允许存储的最大长度。CHARACTER VARYING 和 CHAR VARYING 都是 VARCHAR 的同义词。

对于变长字符串类型,如果输入的字符串长度不够,数据库不会使用空格进行填充。例如,对于数据类型为 VARCHAR(5)的字段,如果输入值为“A”,实际存储的内容为“A”。

Oracle 使用 VARCHAR2 表示变长字符串类型,虽然目前 VARCHAR 是 VARCHAR2 的同义词,但是将来其会被定义为一种新的数据类型。

变长字符串类型一般用于存储长度不固定的文本,比如姓名、电子邮箱、产品描述等。

字符串大对象

CLOB 表示字符串大对象(Character Large Object),用于存储普通字符串类型无法支持的大型文本数据,比如整篇文章、备注、评论等内容。CHARACTER LARGE OBJECT 和 CHAR LARGE OBJECT 都是 CLOB 的同义词。

MySQL 提供了 TINYTEXT、TEXT、MEDIUMTEXT 以及 LONGTEXT,分别用于存储不同长度的文本数据。

Microsoft SQL Server 使用 VARCHAR( MAX )存储大文本数据。

PostgreSQL 使用 TEXT 类型存储任意长度的字符串数据。

日期时间类型

SQL 中与日期和时间相关的数据类型主要包括以下 3 种:

  • DATE,包含年、月、日信息的日期类型。DATE 可以用来存储出生日期、入职日期等。
  • TIME,包含时、分、秒以及小数秒的时间类型。TIME 一般较少使用。
  • TIMESTAMP,包含年、月、日、时、分、秒以及小数秒的时间戳类型。TIMESTAMP 用于对时间精度要求比较高的场景,比如订单时间、发车时间等。

4 种主流数据库对于常用字符串类型的支持如下表所示。

在这里插入图片描述

提示:SQLite 不支持原生的日期时间类型,可以将日期时间存储为数字或者字符串。

Oracle 中的 DATE 类型包含了额外的时、分、秒信息,其不支持 TIME 类型。

MySQL 中的 DATETIME 也表示时间戳类型,选择时需要注意它和 TIMESTAMP 之间的区别。

Microsoft SQL Server 使用 DATETIME2 表示时间戳类型。另外,它也支持 TIMESTAMP 类型,但这是一个 rowversion 数据类型的同义词,和时间戳无关。

某些数据库中的 TIME 和 TIMESTAMP 还支持 WITH TIME ZONE 选项,用于指定一个时区偏移量。例如,UTC(协调世界时)标准时间的 0 点相当于北京时间的早上 8 点。时区选项通常用在支持全球化的应用系统中。

二进制类型

二进制数据类型用于存储二进制文件,比如文档、图片,视频等。SQL 二进制类型具体包含以下 3 种形式:

  • BINARY(n),表示固定长度的二进制数据,其中 n 表示二进制字符数量。
  • VARBINARY(n),表示可变长度的二进制数据,其中 n 表示最大的二进制字符数量。
  • BLOB,表示二进制大对象(Binary Large Object)。

Oracle 支持 BLOB 二进制类型。

MySQL 提供了 BINARY、VARBINARY 以及 TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB 等二进制类型。

Microsoft SQL Server 支持 BINARY、VARBINARY 以及 VARBINARY(MAX)二进制类型。

PostgreSQL 支持 BYTEA 二进制类型。

SQLite 默认使用动态数据类型,任何类型都可以存储二进制数据。如果使用了严格(STRICT)的数据类型,可以使用 BLOB 或者 ANY 类型存储二进制数据。

选择合适的数据类型

我们在选择字段的数据类型时,首先应该满足存储业务数据的要求,其次还需要考虑性能和使用的便捷性。一般来说,我们可以先确定基本的类型:

  • 文本数据使用字符串类型进行存储。
  • 数值数据,尤其是需要进行算术运算的数据,使用数字类型。
  • 日期和时间信息最好使用原生的日期时间类型。
  • 文档、图片、音频和视频等使用二进制类型,或者可以考虑存储在文件服务器上,之后在数据库中存储文件的路径。

然后,我们进一步确定具体的数据类型。

在满足数据存储和扩展的前提下,尽量使用更小的数据类型。这样可以节省一些存储,通常性能也会更好。例如,对于一个小型公司而言,员工人数通常不会超过几百,可以使用 SMALLINT 类型存储员工编号。对于 MySQL 而言,如果无须支持负数,就可以考虑使用无符号的数字类型。

如果我们需要存储精确的数字,要避免使用浮点数字类型。例如,与财务相关的数据,我们应该使用 NUMERIC(p, s)数据类型。另外,我们也可以将数值乘以 10 的 N 次方进行存储,比如将 10.35 存储为整数 103 500,然后在应用程序中进行处理和转换显示。

对于字符串数据,优先使用 VARCHAR 类型。如果字符串的长度固定,我们可以考虑使用 CHAR 类型。另外,只有在普通字符串类型的长度无法满足需求时,才会考虑使用大字段类型。

不建议使用字符串存储日期时间数据,因为它们无法支持数据的运算,比如返回两个日期之间的时间间隔。另外,最好也不要使用当前时间距离 1970 年 1 月 1 日的毫秒数来表示时间,因为这种方式在显示时需要进行额外的转换。

此外,如果一个字段同时出现在多个表中,我们应该使用相同的数据类型。例如,员工表中的部门编号(dept_id)字段与部门表的编号(dept_id)字段应该保持名称和类型一致。

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

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

相关文章

基于Springboot + vue实现的文化民俗网站

作者主页:Java码库 主营内容:SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app等设计与开发。 收藏点赞不迷路 关注作者有好处 文末获取源码 技术选型 【后端】:Java 【框架】:spring…

uni-app的网络请求库封装及使用(同时支持微信小程序)

其实uni-app中内置的uni.request()已经很强大了,简单且好用。为了让其更好用,同时支持拦截器,支持Promise 写法,特对其进行封装。同时支持H5和小程序环境,更好用啦。文中给出使用示例,可以看到使用变得如此…

安卓Zygote进程详解

目录 一、概述二、Zygote如何被启动的?2.1 init.zygote64_32.rc2.2 Zygote进程在什么时候会被重启2.3 Zygote 启动后做了什么2.4 Zygote启动相关主要函数 三、Zygote进程启动源码分析3.1 Nativate-C世界的Zygote启动要代码调用流程3.1.1 [app_main.cpp] main()3.1.2…

11- Redis 中的 SDS 数据结构

字符串在 Redis 中是很常用的,键值对中的键是字符串类型,值有时也是字符串类型。 Redis 是用 C 语言实现的,但是它没有直接使用 C 语言的 char* 字符数组来实现字符串,而是自己封装了一个名为简单动态字符串(simple d…

13.优化界面化的游戏辅助

12.使用mfc实现游戏辅助的界面 在它的代码上进行修改 12.使用mfc实现游戏辅助的界面它的代码是频繁读写游戏的内存,这样不是很好,下面的代码是在它的基础上进行了封装,控制无敌的逻辑在我们申请的内存中实现(也就是在一个全局中实…

gcc 内建函数示例 __builtin_return_address

1,理论未动&#xff0c;示例先行 hello_gcc_callstack.c #include <stdio.h>void do_backtrace() {void *pc0 __builtin_return_address(0);void *pc1 __builtin_return_address(1);void *pc2 __builtin_return_address(2);void *pc3 __builtin_return_address(3);…

oracle中的INTERVAL函数学习总结

Oracle 从9i数据库开始引入了一种新特性&#xff0c;可以用来存储时间间隔&#xff0c;出现了INTERVAL 函数。这个函数的表达式比较多&#xff0c;初学比较费劲不好掌握&#xff0c;经过以几个小时的查阅资料和实验&#xff0c;总结如下&#xff1a; interval year t…

使用Redis常遇到的问题

文章目录 概述缓存雪崩、穿透、击穿大key问题热Key问题缓存和数据库双写一致性问题缓存并发竞争Redis线上阻塞要如何排查Redis 常见的性能问题都有哪些Redis 如何做内存优化Redis数据倾斜 概述 在使用Redis时&#xff0c;有几个常见的问题可能会出现&#xff0c;包括但不限于以…

2022年全国职业院校技能大赛高职组“信息安全管理与评估”赛项第三阶段任务书

第三阶段竞赛项目试题 本文件为信息安全管理与评估项目竞赛-第三阶段试题。根据信息安全管理与评估项目技术文件要求&#xff0c;第三阶段为夺旗挑战CTF&#xff08;网络安全渗透&#xff09;。 本次比赛时间为180分钟。 介绍 夺旗挑战赛&#xff08;CTF&#xff09;的目标…

21 厂商考证介绍(华为 华三 锐键 深信服)+AI 解析

一 认识考证体系 二 明确考证的大致方向 锐键 职业资格证书等级介绍 职业资格证书是由国家职业资格鉴定机构或相关行业主管部门颁发的&#xff0c;用于证明一个人在特定职业领域具备一定技能和知识水平的证明文件。职业资格证书的等级分为初级、中级、高级、技师、高级技师、…

算法每日一题(python,2024.05.29) day.11

题目来源&#xff08;力扣. - 力扣&#xff08;LeetCode&#xff09;&#xff0c;简单&#xff09; 解题思路&#xff1a; 法一&#xff1a;切片函数法 直接用python中的切片函数直接解决 法二&#xff1a;交换法 从俩头开始交换字符串的数字&#xff0c;若为奇数&#xff…

CSRF跨站请求伪造漏洞

CSRF跨站请求伪造漏洞 1.CSRF漏洞概述2.防御CSRF攻击3.CSRF防御绕过CSRF令牌未绑定到用户会话自定义标头令牌绕过绕过Referer检查关键词绕过 4.利用示例使用HTML标签进行GET表单 GET 请求表单POST请求通过 iframe 发送表单 POST 请求Ajax POST 请求 5.CSRF BP 验证方法6.CSRF测…

LabVIEW老程序功能升级:重写还是改进?

概述&#xff1a;面对LabVIEW老程序的功能升级&#xff0c;开发者常常面临重写与改进之间的选择。本文从多个角度分析两种方法的利弊&#xff0c;并提供评估方法和解决思路。 重写&#xff08;重新开发&#xff09;的优势和劣势&#xff1a; 优势&#xff1a; 代码清晰度高&a…

【R语言基础】如何更新R版本

文章目录 概要流程细节具体步骤 概要 提示&#xff1a;由于软件包的更新&#xff0c;所以需要更新R至新版本 流程细节 查看当前R版本 R.version下载更新包&#xff1a;installr install.packages("installr")library(installr)跟着向导一步步执行安装 具体步骤 …

使用Spring Boot自定义注解 + AOP实现基于IP的接口限流和黑白名单

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

技术分享 | SpringBoot 流式输出时,正常输出后为何突然报错?

项目背景 一个 SpringBoot 项目同时使用了 Tomcat 的过滤器和 Spring 的拦截器&#xff0c;一些线程变量在过滤器中初始化并在拦截器中使用。该项目需要调用大语言模型进行流式输出。项目中&#xff0c;笔者使用 SpringBoot 的 ResponseEntity<StreamingResponseBody> 将…

java实现地形dem产汇流流场数据提取解析

一、基础概念 在GIS和气象学、海洋学、大气科学、水文学等领域&#xff0c;"提取流场"通常指的是从数据集中识别和分析流体&#xff08;如水流、风场、洋流、大气流&#xff09;的运动模式和流向的过程。这个过程涉及数据处理、可视化和分析技术&#xff0c;下面是提…

LDR6500一拖二快充线方案

随着科技的飞速发展&#xff0c;我们的电子设备日益增多&#xff0c;从智能手机到平板电脑&#xff0c;再到各种可穿戴设备&#xff0c;它们已成为我们日常生活不可或缺的一部分。然而&#xff0c;随之而来的充电问题也日益凸显。为了解决这一难题&#xff0c;Type-C接口一拖二…

Element快速入门

Vue组件库Element 1 Element介绍 vue是侧重于VM开发的&#xff0c;主要用于数据绑定到视图的&#xff0c;ElementUI就是一款侧重于V开发的前端框架&#xff0c;主要用于开发美观的页面的。 Element&#xff1a;是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库&…

⌈ 传知代码 ⌋ 基于BERT的语义分析实现

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…