数据类型
0x01 数值类型
整数类型
| 类型 |
MySQL |
PostgreSQL |
存储大小 |
说明 |
| TINYINT |
✓ |
✗ |
1字节 |
小整数 (-128 到 127) |
| SMALLINT |
✓ |
✓ |
2字节 |
小整数 (-32768 到 32767) |
| INT/INTEGER |
✓ |
✓ |
4字节 |
标准整数 |
| BIGINT |
✓ |
✓ |
8字节 |
大整数 |
-- MySQL 示例
CREATE TABLE numeric_examples (
id INT PRIMARY KEY,
age TINYINT,
count SMALLINT,
population BIGINT
);
-- PostgreSQL 示例
CREATE TABLE numeric_examples (
id INTEGER PRIMARY KEY,
age SMALLINT,
count INTEGER,
population BIGINT
);
小数类型
| 类型 |
MySQL |
PostgreSQL |
说明 |
| DECIMAL(p,s) |
✓ |
✓ |
精确小数,p=总位数,s=小数位数 |
| NUMERIC(p,s) |
✓ |
✓ |
DECIMAL 的同义词 |
| FLOAT |
✓ |
✓ |
单精度浮点数 |
| DOUBLE |
✓ |
✗ |
双精度浮点数 |
| REAL |
✓ |
✓ |
单精度浮点数 |
-- 精确数值类型示例
CREATE TABLE financial_data (
id INT PRIMARY KEY,
price DECIMAL(10,2), -- 总共10位,其中2位小数
tax_rate DECIMAL(5,4), -- 税率,如 0.1500
quantity INT
);
-- 插入数据
INSERT INTO financial_data VALUES (1, 1234.56, 0.1500, 10);
自增类型
-- MySQL 自增
CREATE TABLE auto_increment_example (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
-- PostgreSQL 自增 (推荐使用 IDENTITY)
CREATE TABLE auto_increment_example (
id SERIAL PRIMARY KEY, -- PostgreSQL 传统方式
name VARCHAR(50)
);
-- PostgreSQL 13+ 标准方式
CREATE TABLE auto_increment_example (
id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
name VARCHAR(50)
);
0x02 字符串类型
定长与变长字符串
| 类型 |
MySQL |
PostgreSQL |
说明 |
| CHAR(n) |
✓ |
✓ |
定长字符串,不足补空格 |
| VARCHAR(n) |
✓ |
✓ |
变长字符串,最大长度n |
| TEXT |
✓ |
✓ |
长文本数据 |
-- 字符串类型示例
CREATE TABLE string_examples (
id INT PRIMARY KEY,
country_code CHAR(2), -- 国家代码,固定2位
username VARCHAR(50), -- 用户名,变长
bio TEXT, -- 个人简介
email VARCHAR(100) -- 邮箱
);
-- 插入数据
INSERT INTO string_examples VALUES
(1, 'CN', '张三', '热爱编程的开发者', 'zhangsan@example.com'),
(2, 'US', 'john_doe', 'Software engineer', 'john@example.com');
特殊字符串类型
-- MySQL 特有类型
CREATE TABLE mysql_string_examples (
id INT PRIMARY KEY,
status ENUM('active', 'inactive', 'pending'), -- 枚举类型
tags SET('tag1', 'tag2', 'tag3') -- 集合类型
);
-- PostgreSQL 特有类型
CREATE TABLE postgresql_string_examples (
id INTEGER PRIMARY KEY,
data JSON, -- JSON 数据
metadata JSONB, -- 二进制 JSON
ip_address INET, -- IP 地址
mac_address MACADDR -- MAC 地址
);
0x03 日期时间类型
日期时间类型
| 类型 |
MySQL |
PostgreSQL |
说明 |
| DATE |
✓ |
✓ |
日期 |
| TIME |
✓ |
✓ |
时间 |
| DATETIME |
✓ |
✗ |
日期时间 |
| TIMESTAMP |
✓ |
✓ |
时间戳 |
| YEAR |
✓ |
✗ |
年份 |
-- MySQL 日期时间示例
CREATE TABLE datetime_examples (
id INT PRIMARY KEY,
birth_date DATE, -- 出生日期
created_at DATETIME, -- 创建时间
updated_at TIMESTAMP, -- 更新时间
event_time TIME, -- 事件时间
birth_year YEAR -- 出生年份
);
-- PostgreSQL 日期时间示例
CREATE TABLE datetime_examples (
id INTEGER PRIMARY KEY,
birth_date DATE, -- 出生日期
event_time TIME, -- 时间
created_at TIMESTAMP, -- 时间戳
updated_at TIMESTAMPTZ, -- 带时区的时间戳
duration INTERVAL -- 时间间隔
);
日期时间函数示例
-- 获取当前时间
SELECT NOW(); -- MySQL/PostgreSQL
SELECT CURRENT_DATE; -- 当前日期
SELECT CURRENT_TIME; -- 当前时间
-- 日期格式化
-- MySQL
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s');
-- PostgreSQL
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS');
-- 日期计算
-- MySQL
SELECT DATE_ADD(NOW(), INTERVAL 1 DAY); -- 加1天
SELECT DATE_SUB(NOW(), INTERVAL 1 MONTH); -- 减1个月
-- PostgreSQL
SELECT NOW() + INTERVAL '1 day'; -- 加1天
SELECT NOW() - INTERVAL '1 month'; -- 减1个月
0x04 二进制类型
| 类型 |
MySQL |
PostgreSQL |
说明 |
| BLOB |
✓ |
✗ |
二进制大对象 |
| BYTEA |
✗ |
✓ |
二进制数据 |
| BINARY(n) |
✓ |
✗ |
固定长度二进制 |
| VARBINARY(n) |
✓ |
✗ |
可变长度二进制 |
-- MySQL 二进制示例
CREATE TABLE binary_examples (
id INT PRIMARY KEY,
image BLOB, -- 图片数据
hash BINARY(32), -- 固定长度哈希值
token VARBINARY(255) -- 可变长度令牌
);
-- PostgreSQL 二进制示例
CREATE TABLE binary_examples (
id INTEGER PRIMARY KEY,
image BYTEA, -- 二进制数据
hash BYTEA -- 哈希值
);
0x05 布尔类型
-- MySQL 布尔类型(实际上是 TINYINT(1) 的别名)
CREATE TABLE boolean_examples (
id INT PRIMARY KEY,
is_active BOOLEAN, -- 等同于 TINYINT(1)
is_deleted BOOL -- 同上
);
-- PostgreSQL 布尔类型
CREATE TABLE boolean_examples (
id INTEGER PRIMARY KEY,
is_active BOOLEAN, -- 真正的布尔类型
is_verified BOOL -- BOOLEAN 的别名
);
-- 布尔值使用
INSERT INTO boolean_examples VALUES (1, TRUE, FALSE);
INSERT INTO boolean_examples VALUES (2, 1, 0); -- MySQL 中 1=true, 0=false
0x06 类型转换
隐式转换
数据库会自动进行某些类型转换:
-- 字符串转数字(自动转换)
SELECT '123' + 1; -- 结果: 124
-- 数字转字符串(自动转换)
SELECT CONCAT('ID: ', 123); -- 结果: 'ID: 123'
显式转换
-- MySQL 转换函数
SELECT CAST('123' AS SIGNED); -- 转换为整数
SELECT CONVERT('2024-01-01', DATE); -- 转换为日期
-- PostgreSQL 转换函数
SELECT CAST('123' AS INTEGER); -- 转换为整数
SELECT '123'::INTEGER; -- PostgreSQL 特有语法
SELECT TO_DATE('2024-01-01', 'YYYY-MM-DD'); -- 转换为日期
参考