SQL(Structured Query Language)详解

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 或 DOUBLEREAL

💡 注意:DECIMALNUMERIC 是精确数值类型,适合财务计算;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 标准定义了一些类型,但各数据库实现不同:

功能MySQLPostgreSQLSQL ServerOracle
字符串VARCHAR, TEXTVARCHAR, TEXTVARCHAR, NVARCHARVARCHAR2, CLOB
大整数BIGINTBIGINTBIGINTNUMBER(38)
布尔TINYINT(1)BOOLEANBITNUMBER(1)
JSONJSONJSONB / JSONJSON (2016+)JSON (12c+)
二进制BLOBBYTEAVARBINARY(MAX)BLOB
时间戳TIMESTAMPTIMESTAMP WITH TIME ZONEDATETIME2TIMESTAMP

三、选择数据类型的建议

  1. 尽量选择最小够用的类型 → 节省存储、提高性能
  2. 避免过度使用 TEXT/BLOB → 影响查询效率
  3. 时间类型:优先 DATETIME(范围大)或 TIMESTAMP(自动时区)
  4. 金额字段用 DECIMAL,不用 FLOAT
  5. VARCHAR 比 CHAR 更常用,除非长度固定
  6. 避免使用 ENUM/SET,改用外键字典表
  7. 主键推荐使用 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 数据类型是数据库设计的基础,正确选择类型可以:

✅ 保证数据完整性
✅ 提高查询性能
✅ 节省存储空间
✅ 避免数据溢出或精度丢失

建议根据实际业务需求、数据规模、查询频率等综合考虑选择最合适的数据类型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值