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)
定点型用于存储精确的小数值,适合那些对数值精度有高要求的场景,比如金融应用。定点型数据类型不会引入浮动的误差,通常用于存储货币值等需要高精度的小数。
常见的定点型数据类型:
- DECIMAL 或 NUMERIC:用于存储具有指定精度和小数位数的数字。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。