当前位置: 首页 > news >正文

SQL数据类型

数字类型

1. 整型(Integer)

整型数据类型用于存储整数值,不包含小数部分。通常用于表示没有小数部分的数字,如年龄、数量、ID 等。
常见的整型数据类型:
  • INT:用于存储常规整数值,通常占用 4 字节(32 位),其范围为 -2,147,483,648 到 2,147,483,647。
    • 示例:INT(例如:25、-100)
  • TINYINT:用于存储非常小的整数值,通常占用 1 字节,其范围为 -128 到 127。
    • 示例:TINYINT(例如:5、-3)
  • SMALLINT:用于存储较小的整数值,通常占用 2 字节,其范围为 -32,768 到 32,767。
    • 示例:SMALLINT(例如:1000、-500)
  • BIGINT:用于存储大整数值,通常占用 8 字节,其范围为 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807。
    • 示例:BIGINT(例如:1000000000000、-500000000000)
  • UNSIGNED:某些数据库系统允许 INT、TINYINT 等类型使用 UNSIGNED 标记,这意味着这些数据类型不再允许负值,范围从 0 到最大值。
    • 示例:UNSIGNED INT 范围为 0 到 4,294,967,295。
示例:
CREATE TABLE employees ( id INT PRIMARY KEY, age SMALLINT, salary BIGINT );
该示例定义了一个 employees 表,包含 id(整数类型)、age(小整数类型)、salary(大整数类型)。

2. 浮点型(Floating Point)

浮点型用于存储具有小数部分的数值,适用于精度要求较低且需要表示范围很大的数字。浮点型存储的数字由两个部分组成: 尾数指数,因此它适用于表示非常大或非常小的数字。
常见的浮点型数据类型:
  • FLOAT:用于存储单精度浮点数,通常占用 4 字节。精度大约为 6 位数字(最大有效位数为 6 位)。
    • 示例:FLOAT(例如:3.14、-2.71)
  • DOUBLE:用于存储双精度浮点数,通常占用 8 字节。精度大约为 15 位数字(最大有效位数为 15 位)。
    • 示例:DOUBLE(例如:3.14159265358979、-1.23456789)
  • REAL:在许多数据库中,REAL 和 FLOAT 之间的区别通常不大,但 REAL 通常是双精度浮点数的别名。
示例:
CREATE TABLE products ( product_id INT PRIMARY KEY, price FLOAT, weight DOUBLE );
该示例定义了一个 products 表,包含 product_id(整数类型)、price(浮动精度的浮点类型)、weight(双精度浮动类型)。

3. 定点型(Fixed Point)

定点型用于存储精确的小数值,适合那些对数值精度有高要求的场景,比如金融应用。定点型数据类型不会引入浮动的误差,通常用于存储货币值等需要高精度的小数。
常见的定点型数据类型:
  • DECIMALNUMERIC:用于存储具有指定精度和小数位数的数字。DECIMAL(p, s) 其中 p 表示总数字位数,s 表示小数位数。它通常用于存储高精度数据(如货币)。
    • 示例:DECIMAL(10, 2) 表示总共有 10 位数字,其中 2 位为小数。
例如:
  • DECIMAL(10, 2) 可以存储 99999999.99,即最多有 8 位整数和 2 位小数。
示例:
CREATE TABLE transactions ( transaction_id INT PRIMARY KEY, amount DECIMAL(10, 2) );
该示例定义了一个 transactions 表,包含 transaction_id(整数类型)和 amount(定点型小数类型,最多 8 位整数和 2 位小数)。

总结:

数据类型
描述
示例
适用场景
INT
整数类型,存储没有小数部分的数字
25
,
-100
存储一般整数(如 ID、数量)
TINYINT
存储非常小的整数值
5
,
-3
存储小范围的整数值(如标志值)
FLOAT
单精度浮动数值,精度较低
3.14
,
-2.71
存储范围大但精度要求不高的浮点数
DOUBLE
双精度浮动数值,精度较高
3.14159
,
-1.23456789
存储精度要求较高的浮动数值
DECIMAL
定点数,精确的小数值
123.45
,
-56.78
金融、货币数据,精度要求高的小数值

选择何时使用哪种数据类型:

  • 整型:用于存储没有小数部分的整数数据。
  • 浮点型:用于存储具有大范围或浮动精度要求的数据,通常用于科学计算或大数据处理。
  • 定点型:用于存储需要精确小数位的数据,适合财务、货币等精度要求高的场景。

时间类型

1. DATE

DATE 类型用于存储日期,格式为 YYYY-MM-DD,即四位数的年份、两位数的月份和两位数的日期。
示例:
CREATE TABLE events ( event_id INT PRIMARY KEY, event_name VARCHAR(100), event_date DATE );
  • 存储格式:2025-04-24
  • 用途:只存储日期,不包含时间部分。常用于记录出生日期、订单日期、活动日期等。
示例数据:
INSERT INTO events (event_id, event_name, event_date) VALUES (1, 'Conference', '2025-05-10');

2. TIME

TIME 类型用于存储时间,格式为 HH:MM:SS,即两位数的小时、两位数的分钟和两位数的秒数。
示例:
CREATE TABLE shifts ( shift_id INT PRIMARY KEY, shift_start TIME, shift_end TIME );
  • 存储格式:14:30:00(表示 14 点 30 分 0 秒)
  • 用途:用于存储时间值,不包含日期部分。例如:工作班次的开始和结束时间。
示例数据:
INSERT INTO shifts (shift_id, shift_start, shift_end) VALUES (1, '08:00:00', '16:00:00');

3. DATETIME

DATETIME 类型用于存储日期和时间的组合,格式为 YYYY-MM-DD HH:MM:SS,即包含完整的日期和时间部分。
示例:
CREATE TABLE appointments ( appointment_id INT PRIMARY KEY, appointment_time DATETIME );
  • 存储格式:2025-04-24 14:30:00
  • 用途:用于存储完整的日期和时间信息。通常用于记录事件发生的确切时间,如会议、预约、事务处理时间等。
示例数据:
INSERT INTO appointments (appointment_id, appointment_time) VALUES (1, '2025-04-24 14:30:00');

4. TIMESTAMP

TIMESTAMP 类型用于存储自某个特定时间(通常是 Unix 纪元时间:1970 年 1 月 1 日)以来的时间戳。它通常精确到秒,且通常用来记录数据的创建或修改时间。
  • 在许多数据库系统中,TIMESTAMP 会自动与数据库中的时间同步,并在插入或更新记录时自动设置时间戳。
示例:
CREATE TABLE logs ( log_id INT PRIMARY KEY, log_message VARCHAR(255), created_at TIMESTAMP );
  • 存储格式:2025-04-24 14:30:00
  • 用途:通常用于存储记录创建或修改的时间戳。它的自动更新时间戳功能使其适用于审计、日志记录等场景。
示例数据:
INSERT INTO logs (log_id, log_message) VALUES (1, 'User logged in');
  • 在插入时,created_at 字段可能会自动被设置为当前时间。

5. YEAR

YEAR 类型用于存储年份,通常格式为 YYYY。
示例:
CREATE TABLE products ( product_id INT PRIMARY KEY, product_name VARCHAR(100), manufacture_year YEAR );
  • 存储格式:2025
  • 用途:用于存储年份信息。适用于那些只关心年份的场景,比如产品制造年份、发行年份等。
示例数据:
INSERT INTO products (product_id, product_name, manufacture_year) VALUES (1, 'Smartphone', 2025);

6. INTERVAL

某些数据库(如 PostgreSQL)还支持 INTERVAL 类型,用于表示时间的间隔。INTERVAL 可以存储某个时间段,例如 2 天、3 小时 10 分钟等。
示例:
CREATE TABLE tasks ( task_id INT PRIMARY KEY, task_duration INTERVAL );
  • 用途:适用于表示时间间隔,例如任务的持续时间或事件间隔。
示例数据:
INSERT INTO tasks (task_id, task_duration) VALUES (1, '2 days 3 hours');

总结 

数据类型
描述
示例数据
用途
DATE
存储日期(没有时间部分)
2025-04-24
存储活动日期、出生日期等
TIME
存储时间(没有日期部分)
14:30:00
存储工作班次的时间、事件发生的时间等
DATETIME
存储日期和时间的组合
2025-04-24 14:30:00
存储完整的事件时间,如预约时间、事务时间
TIMESTAMP
存储从 Unix 纪元起的时间戳
2025-04-24 14:30:00
存储记录的创建或修改时间戳
YEAR
存储年份
2025
存储只包含年份的时间信息
INTERVAL
存储时间间隔
'2 days 3 hours'
存储时间间隔,如任务持续时间

选择合适的日期类型

  • 如果只关心日期,不需要时间部分,选择 DATE。
  • 如果需要记录精确的时间和日期,选择 DATETIME 或 TIMESTAMP(例如:记录订单时间、会议时间等)。
  • 如果只关心年份,选择 YEAR。
  • 如果需要表示时间段或持续时间,选择 INTERVAL。

字符串类型

在 SQL 中,字符串类型用于存储文本数据。不同的数据库管理系统(DBMS)可能会有一些差异,但大部分 SQL 数据库都支持一些常见的字符串类型。下面是 SQL 中常见的字符串数据类型:

1. CHAR(n)

CHAR(字符)类型用于存储定长字符串,其中 n 指定了字符串的长度。如果插入的字符串长度不足 n,数据库会自动在末尾补充空格,直到达到指定的长度。
  • 存储长度:固定长度
  • 用途:适用于存储长度固定的数据,如国家代码、邮政编码、性别等。
示例:
CREATE TABLE users ( id INT PRIMARY KEY, username CHAR(10) -- 固定长度为 10 个字符 );
  • 如果存储 'Alice',数据库会自动在末尾补充空格,直到总长度为 10。
示例数据:
INSERT INTO users (id, username) VALUES (1, 'Alice'); -- 实际存储为 'Alice '

2. VARCHAR(n)

VARCHAR(变长字符)类型用于存储变长字符串,其中 n 指定了最大长度。与 CHAR 不同,VARCHAR 只使用实际存储的字符数,不会填充空格。
  • 存储长度:变长(只使用实际字符数)
  • 用途:适用于存储长度不固定的数据,如姓名、地址、电子邮件等。
示例:
CREATE TABLE users ( id INT PRIMARY KEY, email VARCHAR(100) -- 最大长度为 100 个字符 );
  • 在这种情况下,email 字段最多可以存储 100 个字符,但只会存储实际输入的字符。
示例数据:
INSERT INTO users (id, email) VALUES (1, 'alice@example.com');
  • 存储 'alice@example.com',不添加多余的空格。

3. TEXT

TEXT 类型用于存储较长的文本数据,不限制长度。它适用于存储长度不确定的较大文本数据,如文章内容、评论、日志等。
  • 存储长度:可以存储非常大的文本数据(通常在几千字符到几百万字符之间,取决于数据库的实现)。
  • 用途:用于存储较长的内容,如文章、描述信息等。
示例:
CREATE TABLE posts ( post_id INT PRIMARY KEY, post_content TEXT -- 可存储大文本数据 );
示例数据:
INSERT INTO posts (post_id, post_content) VALUES (1, 'This is a very long post content that can go on for a long time...');

4. BLOB

BLOB(Binary Large Object)类型用于存储二进制数据,例如图像、音频、视频等。虽然 BLOB 也可以存储文本数据,但它主要用于存储非文本二进制数据。
  • 存储长度:可以存储大量二进制数据(通常为几百万字节)。
  • 用途:用于存储非文本数据,如图片、视频、文件等。
示例:
CREATE TABLE files ( file_id INT PRIMARY KEY, file_data BLOB -- 用于存储二进制数据(例如图片或文件) );
示例数据:
-- 假设我们要插入一个图像文件到 `file_data` 列 -- 这通常需要通过编程语言(如 Python 或 PHP)与数据库连接来实现二进制数据插入

5. ENUM

ENUM 类型用于存储一组预定义的值中的一个。它是一个字符串类型,但其值必须是一个预定义的集合中的某个值。适用于存储有限数量的选择项。
  • 存储长度:根据枚举值的数量决定,通常是一个较短的字符串。
  • 用途:适用于有限选择范围的字段,如状态标记、性别、颜色等。
示例:
CREATE TABLE orders ( order_id INT PRIMARY KEY, order_status ENUM('Pending', 'Shipped', 'Delivered') -- 预定义值集合 );
示例数据:
INSERT INTO orders (order_id, order_status) VALUES (1, 'Shipped');
  • order_status 列只能存储 'Pending'、'Shipped' 或 'Delivered' 中的一个值。

6. SET

SET 类型类似于 ENUM,但它允许存储多个预定义值的组合。它用于存储一组不重复的选择项。
  • 存储长度:存储一组字符串,允许多个选择。
  • 用途:适用于存储多个可选项的场景,如用户的兴趣标签等。
示例:
CREATE TABLE users ( user_id INT PRIMARY KEY, interests SET('Sports', 'Music', 'Reading', 'Traveling') -- 可以选择多个值 );
示例数据:
INSERT INTO users (user_id, interests) VALUES (1, 'Sports,Traveling'); -- 该用户兴趣是 "Sports" 和 "Traveling"

7. JSON(在某些数据库中支持)

JSON 类型用于存储 JSON 格式的数据,适用于结构化但不规则的数据。它允许存储嵌套的数据结构,如对象和数组。
  • 存储长度:根据 JSON 数据的实际大小。
  • 用途:适用于存储需要嵌套结构的文本数据,如用户配置、日志数据、API 响应等。
示例:
CREATE TABLE users ( user_id INT PRIMARY KEY, user_info JSON -- 存储 JSON 数据 );
示例数据:
INSERT INTO users (user_id, user_info) VALUES (1, '{"name": "Alice", "age": 25, "email": "alice@example.com"}');
  • 存储一个包含姓名、年龄和电子邮件的 JSON 对象。

总结

数据类型
描述
示例
用途
CHAR(n)
定长字符串类型
'Alice '
,
'John '
存储长度固定的字符串,如国家代码、邮政编码等
VARCHAR(n)
变长字符串类型
'Alice'
,
'john@example.com'
存储长度不固定的字符串,如名字、电子邮件等
TEXT
长文本类型
'This is a very long post...'
存储长文本数据,如文章内容、评论等
BLOB
存储二进制数据
二进制数据(如图片或文件)
存储图像、视频、音频等二进制数据
ENUM
存储预定义的选项之一
'Shipped'
,
'Delivered'
存储有限集合中的值,如订单状态、性别等
SET
存储多个预定义值的集合
'Sports,Reading'
存储多个选择项,如用户兴趣等
JSON
存储 JSON 格式的数据
{"name": "Alice", "age": 25}
存储结构化数据,如用户配置、AP响应等

选择适合的字符串类型

  • 定长 vs 变长:如果数据的长度是固定的,选择 CHAR,否则选择 VARCHAR。
  • 长文本:如果数据是长文本,选择 TEXT。
  • 有限选项:如果字段只允许特定的一组值,选择 ENUM 或 SET。
  • 嵌套数据:如果需要存储复杂的数据结构,选择 JSON。

相关文章:

  • shell练习(2)
  • 保安员理论考试要点总结
  • 多线程环境下的资源共享与线程安全问题
  • 怎么设定自动化测试目标?
  • 机器人结构认知与安装
  • PowerBI-使用参数动态修改数据源路径
  • Bandizip解压缩软件 v7.37 正式版解锁专业版
  • IOMUXC_SetPinMux的0,1参数解释
  • 北斗导航 | 基于LSTM(长短期记忆网络)的北斗导航定位算法
  • 桌面应用中VUE使用新浏览器窗口打开页面
  • 性行为同意协议系统网站源码
  • STM32F103_HAL库+寄存器学习笔记20 - CAN发送中断+ringbuffer + CAN空闲接收中断+接收所有CAN报文+ringbuffer
  • 输入捕获模式测频率
  • 2025年3月电子学会青少年机器人技术(三级)等级考试试卷-实际操作
  • 光影编程师:Threejs Shader 基础全攻略
  • 【嵌入式系统设计师(软考中级)】第二章:嵌入式系统硬件基础知识(3)
  • 18.应用聚合、指标显示、应用状态,从Heimdall说起(二)
  • JavaScript 实现继承及 Class 本质详解
  • 上篇:深入剖析 BLE 底层物理层与链路层(约5000字)
  • 链表-两两交换链表中的结点
  • 南国置业:控股股东电建地产拟受让公司持有的房地产开发业务等相关资产和负债
  • 因商标近似李小龙形象被裁定无效,真功夫起诉国家知产局,法院判了
  • 加拿大财长:加拿大需要抗击美国关税
  • 李良生已任应急管理部党委委员、政治部主任
  • 三亚亚龙湾3.4公里岸线近岸海域使用权挂牌出让,起始价近九千万
  • 商务部:美方应彻底取消所有对华单边关税措施