MySQL & PostgreSQL 常用数据类型
MySQL & PostgreSQL
本文章所有资料均来自 MySQL 5.7 文档1与 PostgreSQL 10 文档2。
常用数据类型
数字类型
整数类型
数据类型 | MySQL | PostgreSQL |
---|---|---|
INT2 | SMALLINT 的别名 | SMALLINT 的别名 |
SMALLINT | 2 字节整数,SMALLINT(6) 的别名* | 2 字节整数 |
INT | 4 字节整数,INT(11) 的别名* | INTEGER 的别名 |
INT4 | INT 的别名 | INTEGER 的别名 |
INTEGER | INT 的别名 | 4 字节整数 |
BIGINT | 8 字节整数,BIGINT(20) 的别名* | 8 字节整数 |
INT8 | BIGINT 的别名 | BIGINT 的别名 |
*在MySQL中,SMALLINT、INT和BIGINT的参数为显示宽度。
字节数 | 范围 | 范围 |
---|---|---|
1 | (-27, 27-1) | (-128, 127) |
2 | (-215, 215-1) | (-32768, 32767) |
4 | (-231, 231-1) | (-2147483648, 2147483647) |
8 | (-263, 263-1) | (-9223372036854775808, 9223372036854775807) |
定点数类型(任意精度)
数据类型 | MySQL | PostgreSQL |
---|---|---|
DEC | DECIMAL 的别名 | NUMERIC 的别名 |
DEC(precision, scale = 0) | DECIMAL(precision, scale) 的别名 | NUMERICL(precision, scale) 的别名 |
DECIMAL | DECIMAL(10) 的别名 | NUMERIC 的别名 |
DECIMAL(precision, scale = 0) | 可选精度的精确数字,precision: (0, 65), scale: (0, 30) | NUMERICL(precision, scale) 的别名 |
NUMERIC | DECIMAL 的别名 | 精确数字 |
NUMERIC(precision, scale = 0) | DECIMAL(precision, scale) 的别名 | 可选精度的精确数字,precision: (0, 1000), scale: (0, 1000) |
(precision >= scale),其中 precision 为数字位数,scale 为小数位数。
浮点数类型
数据类型 | MySQL | PostgreSQL |
---|---|---|
FLOAT | 单精度浮点数 (4 字节) | DOUBLE PRECISION 的别名 |
FLOAT(precision) | FLOAT 的别名,precision: (0, 24) | REAL 的别名,precision: (1, 24) |
DOUBLE 的别名*,precision: (25, 53) | DOUBLE PRECISION 的别名,precision: (25, 53) | |
FLOAT4 | FLOAT 的别名 | REAL 的别名 |
REAL | DOUBLE 的别名* | 单精度浮点数 (4 字节) |
DOUBLE PRECISION | DOUBLE 的别名* | 双精度浮点数 (8 字节) |
FLOAT8 | DOUBLE 的别名* | DOUBLE PRECISION 的别名 |
*在MySQL中,DOUBLE为双精度浮点数(8字节)。
序数类型
数据类型 | MySQL | PostgreSQL |
---|---|---|
SERIAL | BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名 | INTEGER NOT NULL DEFAULT nextval(‘tablename_colname_seq’) 的别名 |
布尔类型
数据类型 | MySQL | PostgreSQL |
---|---|---|
BOOL | TINYINT(1) 的别名* | BOOLEAN 的别名 |
BOOLEAN | TINYINT(1) 的别名* | 逻辑布尔值(真/假) |
状态为真的值为 TRUE
* 或 '1'
,状态为假的值为 FALSE
* 或 '0'
。
*在MySQL中,TINYINT为1字节整数,其参数为显示宽度。
*在MySQL中,TRUE是1的别名,FALSE是0的别名。
字符串类型
数据类型 | MySQL | PostgreSQL |
---|---|---|
CHAR(length = 1) | 定长字符串,length: (0, 255) | CHARACTER(length) 的别名 |
CHARACTER(length = 1) | CHAR(length) 的别名 | 定长字符串,length: (1, 10485760) |
NATIONAL CHAR(length = 1) | CHAR(length) CHARACTER SET utf8 的别名3 | CHARACTER(length) 的别名 |
NATIONAL CHARACTER(length = 1) | CHAR(length) CHARACTER SET utf8 的别名3 | CHARACTER(length) 的别名 |
NCHAR(length = 1) | CHAR(length) CHARACTER SET utf8 的别名3 | CHARACTER(length) 的别名 |
CHAR VARYING(length) | VARCHAR(length) 的别名 | CHARACTER VARYING(length) 的别名 |
CHARACTER VARYING(length) | VARCHAR(length) 的别名 | 变长字符串,length: (1, 10485760) |
NATIONAL CHAR VARYING(length) | VARCHAR(length) CHARACTER SET utf8 的别名3 | CHARACTER VARYING(length) 的别名 |
NATIONAL CHARACTER VARYING(length) | VARCHAR(length) CHARACTER SET utf8 的别名3 | CHARACTER VARYING(length) 的别名 |
NCHAR VARYING(length) | VARCHAR(length) CHARACTER SET utf8 的别名3 | CHARACTER VARYING(length) 的别名 |
VARCHAR(length) | 变长字符串,(length >= 0) | CHARACTER VARYING(length) 的别名 |
TEXT | 字符串,最大长度为 65535 (216-1) 个字节 | 无限长字符串 |
length 为字符个数。
日期 / 时间类型
数据类型 | MySQL | PostgreSQL | ISO 8601 格式值 |
---|---|---|---|
DATE | 日期 | 日期 | 'YYYY-MM-DD' |
TIME | TIME(0) 的别名 | TIME(6) 的别名 | 'hh:mm:ss' |
TIME(precision) | 时间 | 时间 | 'hh:mm:ss.ssssss' |
TIMESTAMP | TIMESTAMP(0) 的别名 | TIMESTAMP(6) 的别名 | 'YYYY-MM-DDThh:mm:ss' |
TIMESTAMP(precision) | 时间戳 | 时间戳 | 'YYYY-MM-DDThh:mm:ss.ssssss' |
precision: (0, 6),其为秒的小数位数。
JSON 类型
数据类型 | 实例值 |
---|---|
JSON | '[{"key":"value"}]' |
位串类型
数据类型 | MySQL | PostgreSQL | 实例值 |
---|---|---|---|
BIT(length = 1) | 位串,length: (1, 64) | 位串,length: (1, 83886080) | b'0110' 或 B'0110' |
JSON 类型示例
创建表格
DROP TABLE IF EXISTS my_table;
CREATE TABLE my_table
(
id SERIAL,
json_data JSON,
PRIMARY KEY (id)
);
INSERT INTO my_table(json_data) VALUES('[{"key":"value"}]');
SELECT * FROM my_table;
查询 JSON 数据
MySQL
以 JSON 形式获取 JSON 元素:4
SELECT
json_data->'$[0].key'
FROM
my_table;
以文本形式获取 JSON 元素:4
SELECT
json_data->>'$[0].key'
FROM
my_table;
PostgreSQL
以 JSON 形式获取 JSON 元素:5
SELECT
json_data->0->'key'
FROM
my_table;
以文本形式获取 JSON 元素:5
SELECT
json_data->0->>'key'
FROM
my_table;