SQL(Structured Query Language)本身是一种查询语言,不是编程语言,它主要用于操作关系型数据库。但在使用 SQL 时,数据类型是极其重要的概念,因为表结构的定义、数据的存储、查询的效率、数据完整性等都依赖于正确的数据类型选择。
一、SQL 数据类型分类
SQL 数据类型通常分为以下几大类(不同数据库系统略有差异,但大体一致):
1. 数值类型(Numeric Types)
用于存储数字,包括整数和小数。
| 类型 | 描述 | 示例(MySQL) |
|---|---|---|
INT / INTEGER | 整数,通常4字节 | INT(11) |
TINYINT | 小整数,1字节(-128~127 或 0~255 无符号) | TINYINT UNSIGNED |
SMALLINT | 小整数,2字节 | SMALLINT |
MEDIUMINT | 中等整数,3字节(MySQL特有) | MEDIUMINT |
BIGINT | 大整数,8字节 | BIGINT |
DECIMAL(p,s) | 精确小数,p=总位数,s=小数位 | DECIMAL(10,2) |
NUMERIC(p,s) | 同 DECIMAL(标准SQL) | NUMERIC(8,3) |
FLOAT | 单精度浮点数 | FLOAT |
DOUBLE | 双精度浮点数 | DOUBLE |
REAL | 通常等同于 FLOAT 或 DOUBLE | REAL |
💡 注意:
DECIMAL和NUMERIC是精确数值类型,适合财务计算;FLOAT/DOUBLE是近似值,适合科学计算。
2. 字符串类型(Character/String Types)
用于存储文本数据。
| 类型 | 描述 | 示例 |
|---|---|---|
CHAR(n) | 定长字符串,n为字符数,不足补空格 | CHAR(10) |
VARCHAR(n) | 变长字符串,n为最大字符数 | VARCHAR(255) |
TEXT | 长文本(MySQL中最大65535字节) | TEXT |
TINYTEXT | 小文本(MySQL,最大255字节) | TINYTEXT |
MEDIUMTEXT | 中等文本(MySQL,约16MB) | MEDIUMTEXT |
LONGTEXT | 长文本(MySQL,约4GB) | LONGTEXT |
BINARY(n) | 定长二进制 | BINARY(16) |
VARBINARY(n) | 变长二进制 | VARBINARY(255) |
BLOB | 二进制大对象(图片、文件等) | BLOB |
TINYBLOB | 小二进制对象 | TINYBLOB |
MEDIUMBLOB | 中等二进制对象 | MEDIUMBLOB |
LONGBLOB | 大二进制对象 | LONGBLOB |
💡
CHAR适合固定长度字段(如国家代码、性别);VARCHAR更节省空间,适合长度变化大的字段。
3. 日期和时间类型(Date and Time Types)
用于存储日期、时间或两者组合。
| 类型 | 描述 | 示例 |
|---|---|---|
DATE | 日期,格式 ‘YYYY-MM-DD’ | DATE |
TIME | 时间,格式 ‘HH:MM:SS’ | TIME |
DATETIME | 日期+时间,范围大(1000~9999年) | DATETIME |
TIMESTAMP | 时间戳,范围小(1970~2038),自动更新 | TIMESTAMP |
YEAR | 年份(2位或4位) | YEAR(4) |
💡 MySQL 中
TIMESTAMP会自动转换为 UTC 存储,并随系统时区变化;DATETIME不会。
4. 布尔类型(Boolean Type)
标准 SQL 有 BOOLEAN,但很多数据库用整数模拟:
- MySQL:没有
BOOLEAN,使用TINYINT(1),0=false, 1=true - PostgreSQL:支持
BOOLEAN - SQL Server:使用
BIT
-- PostgreSQL
CREATE TABLE users (is_active BOOLEAN);
-- MySQL
CREATE TABLE users (is_active TINYINT(1) DEFAULT 1);
5. 枚举和集合类型(ENUM / SET) — MySQL 特有
ENUM('值1','值2',...):只能选其中一个值SET('值1','值2',...):可选多个值(逗号分隔)
CREATE TABLE shirts (
size ENUM('S', 'M', 'L', 'XL'),
colors SET('red', 'blue', 'green')
);
⚠️ 不推荐过度使用 ENUM/SET,不利于扩展,建议用外键关联字典表。
6. JSON 类型(现代数据库支持)
- MySQL 5.7+、PostgreSQL 9.2+、SQL Server 2016+ 支持原生 JSON 类型
- 用于存储结构化非关系型数据
CREATE TABLE users (
id INT PRIMARY KEY,
profile JSON
);
-- PostgreSQL
INSERT INTO users VALUES (1, '{"name": "Alice", "age": 30}');
7. 空间数据类型(GIS)
如 POINT, LINESTRING, POLYGON 等,用于地理信息系统(PostGIS、MySQL Spatial 等支持)。
CREATE TABLE places (
location POINT
);
二、不同数据库系统的类型差异
虽然 SQL 标准定义了一些类型,但各数据库实现不同:
| 功能 | MySQL | PostgreSQL | SQL Server | Oracle |
|---|---|---|---|---|
| 字符串 | VARCHAR, TEXT | VARCHAR, TEXT | VARCHAR, NVARCHAR | VARCHAR2, CLOB |
| 大整数 | BIGINT | BIGINT | BIGINT | NUMBER(38) |
| 布尔 | TINYINT(1) | BOOLEAN | BIT | NUMBER(1) |
| JSON | JSON | JSONB / JSON | JSON (2016+) | JSON (12c+) |
| 二进制 | BLOB | BYTEA | VARBINARY(MAX) | BLOB |
| 时间戳 | TIMESTAMP | TIMESTAMP WITH TIME ZONE | DATETIME2 | TIMESTAMP |
三、选择数据类型的建议
- 尽量选择最小够用的类型 → 节省存储、提高性能
- 避免过度使用 TEXT/BLOB → 影响查询效率
- 时间类型:优先 DATETIME(范围大)或 TIMESTAMP(自动时区)
- 金额字段用 DECIMAL,不用 FLOAT
- VARCHAR 比 CHAR 更常用,除非长度固定
- 避免使用 ENUM/SET,改用外键字典表
- 主键推荐使用 INT 或 BIGINT 自增,或 UUID(分布式)
四、示例:创建用户表(MySQL)
CREATE TABLE users (
id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
email VARCHAR(255) NOT NULL,
age TINYINT UNSIGNED,
salary DECIMAL(10,2),
is_active TINYINT(1) DEFAULT 1,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
profile JSON
);
五、查看表结构的 SQL 命令
- MySQL:
DESC table_name;或SHOW COLUMNS FROM table_name; - PostgreSQL:
\d table_name - SQL Server:
EXEC sp_columns 'table_name'; - 通用:
SELECT * FROM information_schema.columns WHERE table_name = 'xxx';
总结
SQL 数据类型是数据库设计的基础,正确选择类型可以:
✅ 保证数据完整性
✅ 提高查询性能
✅ 节省存储空间
✅ 避免数据溢出或精度丢失
建议根据实际业务需求、数据规模、查询频率等综合考虑选择最合适的数据类型。
26万+

被折叠的 条评论
为什么被折叠?



