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

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

本文将会介绍五种主流数据库中常用的数据类型以及如何选择合适的数据类型,包括 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)字段应该保持名称和类型一致。

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

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

相关文章

【Linux】从零开始认识进程间通信 —— 共享内存

送给大家一句话: 吃苦受难绝不是乐事一桩,但是如果您恰好陷入困境,我很想告诉您:“尽管眼前十分困难,可日后这段经历说不定就会开花结果。”请您这样换位思考、奋力前行。 -- 村上春树 🔆🔆&…

[数据集][目标检测]打架检测数据集VOC格式3146张2类别

数据集格式:Pascal VOC格式(不包含分割的txt文件,仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数):3146 标注数量(xml文件个数):3146 标注类别数:2 标注类别名称:["nofight","fight"] 每个类别…

c# - 运算符 << 不能应用于 long 和 long 类型的操作数

Compiler Error CS0019 c# - 运算符 << 不能应用于 long 和 long 类型的操作数 处理方法 特此记录 anlog 2024年5月30日

PBR系列-物理材质(上)

作者&#xff1a;游梦 对PBR系列文章感兴趣还可以看前文&#xff1a; PBR系列 - 物理光源 PBR系列-光之简史 前面两篇文章分别介绍了物理光源与光学研究简史&#xff0c;在对光有了简单认识之后&#xff0c;再认识物理材质会发现其实本质上还是对光的研究&#xff0c;再深入…

python爬取每日天气情况

python爬取每日天气情况 一、项目简介二、完整代码一、项目简介 本次爬取的目标数据来源于天气网,数据所在的页面如下图所示,本次任务较为简单,按照正常操作流程操作即可,即抓包分析数据接口,发送请求获取数据,解析数据并持久化存储。发送请求使用requests库,解析数据使…

CMake的原理与使用方法

一.为什么需要CMake&#xff0c;什么是CMake 1.由于各种make工具遵循不同的规范和标准&#xff0c;所执行的Makefile格式也不同&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MS nmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;…

【3GPP IAB】NR IAB推荐架构

1 概述 3GPP所有提交给RAN-3 #99的IAB多跳设计都可以用五个架构参考图来表示。这些参考图的不同之处是需要对接口进行修改&#xff0c;或者需要额外的功能&#xff0c;例如完成多跳转发。这五个体系结构被分为两个体系结构组。这些架构的主要特点可以概括如下: 架构组1:由架构1…

java期末突击

目录 1. 快速入门 2. 类 3. 成员方法 4. 构造器 5. 单例模式 6. 继承 7. 抽象类 8. 多线程&#xff08;Thread与Runnable&#xff09; 1. 快速入门 public class Hello {public static void main(String[] args){System.out.println("Hello,World&q…

从头开始构建GPT标记器

从头开始构建GPT标记器 对于GPT Tokenizer&#xff0c;论文《Language Models are Unsupervised Multitask Learners》中介绍了一种字节级编码作为LLM的标记化机制&#xff1a; The vocabulary is expanded to 50,257. We also increase the context size from 512 to 1024 to…

C# 代码配置的艺术

文章目录 1、代码配置的定义及其在软件工程中的作用2、C# 代码配置的基本概念和工具3、代码配置的实践步骤4、实现代码配置使用属性&#xff08;Properties&#xff09;使用配置文件&#xff08;Config Files&#xff09;使用依赖注入&#xff08;Dependency Injection&#xf…

跨境电商如何有效做好店铺账号管理?

跨境电商有效做好店铺账号管理至关重要&#xff0c;类似亚马逊、Temu、TikTok、ebay跨境电商账号涉及多个方面&#xff0c;包括多个账户的安全性、合规性、操作效率等。以下是一些我自己实操的策略和实践&#xff0c;希望能够帮助大家更好地管理跨境电商店铺账号。 一、哪些行为…

Spring Boot 整合 spring-boot-starter-mail 实现邮件发送和账户激活

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

单片机串口接收负数的处理方法

dp80中有很多外设处理相关的都是有符号数据。 如dpm计算的结果&#xff0c;插入dpm后有时候会得到0xFFFFFFFE-2&#xff08;从调试界面也可以看到&#xff09;。

【深度密码】神经网络算法在机器学习中的前沿探索

目录 &#x1f69d;前言 &#x1f68d;什么是机器学习 1. 基本概念 2. 类型 3. 关键算法 4. 应用领域 5. 工作流程 &#x1f68b;什么是神经网络 基本结构 &#x1f682;神经网络的工作原理 前向传播&#xff08;Forward Propagation&#xff09;&#xff1a; 损失函…

RT-DETR:端到端的实时Transformer检测模型(目标检测+跟踪)

博主一直一来做的都是基于Transformer的目标检测领域&#xff0c;相较于基于卷积的目标检测方法&#xff0c;如YOLO等&#xff0c;其检测速度一直为人诟病。 终于&#xff0c;RT-DETR横空出世&#xff0c;在取得高精度的同时&#xff0c;检测速度也大幅提升。 那么RT-DETR是如…

前端 CSS 经典:3D Hover Effect 效果

前言&#xff1a;有趣的 3D Hover Effect 效果&#xff0c;通过 js 监听鼠标移动&#xff0c;动态赋值 rotateX&#xff0c;rotateY 的旋转度来实现。 效果图&#xff1a; 代码实现&#xff1a; <!DOCTYPE html> <html lang"en"><head><meta …

基于鲲鹏服务器搭建简单的开源论坛系统(LAMP)实践分享

LAMPLinux apache mysql( mariadb) PHP 结合利用华为云弹性负载均衡ELB弹性伸缩AS服务 优点&#xff1a; 将访问流量自动分发到多台云服务器&#xff0c;扩展应用系统对外的服务能力&#xff0c;实现更高水平的应用容错&#xff1b; 根据不同的业务、访问需求和预设策略&…

flask-slqalchemy使用详解

目录 1、flask-sqlalchemy 1.1、flask_sqlalchemy 与sqlalchemy 的关系 1.1.1、 基本定义与用途 1.2、flask_sqlalchemy 的使用 1.2.1、安装相关的库 1.2.2、项目准备 1.2.3、创建ORM模型 1.2.3.1、使用db.create_all()创建表的示例 1.2.3.2、创建多表关联ORM模型 1.…

【ETAS CP AUTOSAR基础软件】EcuM模块详解

文章包含了AUTOSAR基础软件&#xff08;BSW&#xff09;中EcuM模块相关的内容详解。本文从AUTOSAR规范解析&#xff0c;ISOLAR-AB配置以及模块相关代码分析三个维度来帮读者清晰的认识和了解EcuM。文中涉及的SOLAR-AB配置以及模块相关代码都是依托于ETAS提供的工具链来配置与生…

语音群呼之语音导航的应用

在数字化时代&#xff0c;语音群呼技术已成为企业、组织和个人高效沟通的重要工具。语音群呼不仅能够快速地将信息传递给目标群体&#xff0c;而且通过语音导航功能&#xff0c;还能确保信息传达的准确性和用户体验的优质性。本文将深入探讨语音群呼的语音导航功能&#xff0c;…