数据类型

数值类型

整数

类型 字节 最小值 最小值(无符号) 最大值 最大值(无符号)
TINYINT 2 -128 0 127 255
SMALLINT 2 -32768 0 32767 65535
MEDIUMINT 4 -8388608 0 8388607 16777215
INT 4 -2147483648 0 2147483647 4294967295
BIGINT 8 -2^63^ 0 2^63^-1 2^64^-1

语法

TINYINT[(M)] [UNSIGNED] [ZEROFILL]

SMALLINT[(M)] [UNSIGNED] [ZEROFILL]

MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]

INT[(M)] [UNSIGNED] [ZEROFILL]

BIGINT[(M)] [UNSIGNED] [ZEROFILL]

参数

M

表示最大显示宽度。显示宽度与类型可以存储的值的范围无关。最大值为255。

UNSIGNED

标识了此数据类型为无符号类型。

ZEROFILL

如果为数值列指定了ZEROFILL,会自动向该列添加UNSIGNED属性。

示例

create table t1(c1 tinyint);

insert into t1 values(-128);

create table t2(c1 smallint);

insert into t2 values(0);

create table t3(c1 mediumint);

insert into t3 values(8388607);

create table t4(c1 integer);

insert into t4 values(-2147483648);

create table t5(c1 bigint);

insert into t5 values(9223372036854775807);

浮点数

FLOAT

单精度浮点数,允许的值范围是-3.402823466E+38到-1.175494351E-38,0,以及1.175494351E-38到3.402823466E+38。这些是基于IEEE标准的理论限制。实际范围可能会稍微小一些,具体取决于硬件或操作系统。

DOUBLE

双精度浮点数。允许的值范围是 -1.7976931348623157E+308到 -2.2250738585072014E-308,0,以及2.2250738585072014E-308到1.7976931348623157E+308。这些是基于IEEE标准的理论限制。实际范围可能会稍微小一些,具体取决于硬件或操作系统。

REAL

如果启用了REAL_AS_FLOAT模式,REAL是FLOAT的同义词;如果没有启用REAL_AS_FLOAT模式,REAL是DOUBLE的同义词。

语法

FLOAT[(M,D)]

FLOAT(p)

DOUBLE[(M,D)]

DOUBLE PRECISION[(M,D)]

REAL[(M,D)]

参数

M

可以存储的数字的总位数,最大值为255。

D

小数点后面的数字位数。最大值为30。

如果省略M和D,则值会按照硬件允许的限制存储。单精度浮动点数的精度大约为7位小数,双精度浮动点数的精度大约为 15 位小数。

p

表示位数的精度。仅使用此值来确定结果数据类型是使用FLOAT还是DOUBLE。如果p的值在0到24之间,数据类型将变为FLOAT,且没有M或D值。如果p的值在25到53之间,数据类型将变为DOUBLE,且没有M或D值。结果列的范围单精度FLOAT或双精度DOUBLE数据类型相同。

示例

##float

set sql_mode='REAL_AS_FLOAT';

create table t1(c1 float(1,0));

INSERT INTO t1 (c1) VALUES (3.14);

create table t2(c1 real);

INSERT INTO t2 (c1) VALUES (7.89);

##double

set sql_mode='';

create table t3(c1 double(255,30));

INSERT INTO t3 (c1) VALUES (1.6180339887);

create table t4(c1 real);

INSERT INTO t4 (c1) VALUES (1.414);

BIT类型

BIT数据类型是一种位值类型,用于存储位值。指定位值可以使用b'value'表示法,value是使用0和1表示的一个二进制值。例如,b'111'和b'10000000'分别表示7和128。

BIT类型从V9.0.5开始支持。

语法

BIT[(M)]

参数

M

M表示每个值的位数,范围从1到64。如果省略M,则默认值为1。

如果将小于M位长的值分配给BIT(M)列,该值会在左侧填充零。例如,将b'101'分配给BIT(6)列,实际上等同于分配b'000101'。

示例

create table t1(c1 bit);

INSERT INTO t1 (c1) VALUES (B'1');

create table t2(c1 bit(6));

INSERT INTO t2 (c1) VALUES (B'1101');

字符类型

CHAR

一种固定长度的字符串,在存储时始终用空格右填充到指定长度。

支持 sql_mode 包含 PAD_CHAR_TO_FULL_LENGTH 的情况,以及cast(‘aaa’ as char)。

语法

CHAR[(M)]

参数

M

基于PG的char类型,增加了对char(0)的支持。M代表列的长度(以字符为单位),默认为1。

示例

create table type_c (c char(1));

insert into type_c values('a');

VARCHAR

一个可变长度的字符串。

语法

VARCHAR(M)

NCHAR VARCHAR(M)

参数

M

基于PG的varchar类型,增加了对varchar(0)的支持。M代表列的长度(以字符为单位),默认为1。

示例

create table type_vc (vc varchar);

insert into type_vc values('a');

create table type_nvc (vc nchar varchar(6));

insert into type_nvc values('abcd');

create table type_vc0 (vc varchar(0));

insert into type_vc0 values('');

TEXT

文本数据类型,用于存储大量文本数据。可以使用不同的变体,如TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT,它们的最大长度逐渐增加:

TINYTEXT:255(2^8^ − 1)个字符

TEXT:65,535 (2^16^ − 1) 个字符

MEDIUMTEXT:16,777,215 (2^24^ − 1)个字符

LONGTEXT:1GB个字符

语法

TEXT[(M)]

TINYTEXT

MEDIUMTEXT

LONGTEXT

参数

M

基于PG的text类型,增加了对text(M)的支持。表示文本列的最大长度,通常不需要指定,因为 TEXT 类型本身已经有最大长度限制。

示例

##text

CREATE TABLE TextTest (t text);

INSERT INTO TextTest VALUES('This is a text test.');

##tinytext

CREATE TABLE TinyTextTest (

id INT PRIMARY KEY,

short_description TINYTEXT

);

INSERT INTO TinyTextTest (id, short_description) VALUES (1, 'This is a
short text.');

##mediumtext

CREATE TABLE MediumTextTest (

id INT PRIMARY KEY,

medium_description MEDIUMTEXT

);

INSERT INTO MediumTextTest (id, medium_description) VALUES (1, 'This is
a medium-length text.');

##longtext

CREATE TABLE LongTextTest (

id INT PRIMARY KEY,

long_description LONGTEXT

);

INSERT INTO LongTextTest (id, long_description) VALUES (1, 'This is a
long text.');

二进制类型

BINARY

描述

BINARY类型类似于CHAR类型,但存储的是二进制字节字符串,而不是非二进制字符字符串。BINARY是定长的二进制类型,可选的长度M表示列的字节长度,最大长度为255,如果省略,M默认值为1。

示例

create table tb(c binary(5));

INSERT INTO tb (c) VALUES('a\0\0');

VARBINARY

描述

VARBINARY类型类似于VARCHAR类型,但存储的是二进制字节字符串,而不是非二进制字符字符串。VARBINARY是变长的二进制类型,M表示列的最大长度,以字节为单位,最大长度为65532。

示例

create table tvb(c varbinary(10));

INSERT INTO tvb (c) VALUES ('1234567890');

BLOB

描述

BLOB
是一种二进制大对象,可以存储可变量的数据。四种BLOB类型分别是TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们的区别仅在于它们能存储的最大值长度:

TINYBLOB:255(2^8^ − 1)字节

BLOB:65,535 (2^16^ − 1) 字节

MEDIUMBLOB:16,777,215 (2^24^ − 1) 字节

LONGBLOB:1GB 字节

示例

create table test_blob (c BLOB);

INSERT INTO test_blob (c) VALUES (X'48656C6C6F');

create table test_tinyblob (c TINYBLOB);

INSERT INTO test_tinyblob (c) VALUES (X'01');

create table test_mediumblob (c MEDIUMBLOB);

INSERT INTO test_mediumblob (c) VALUES (X'1234567890ABCDEF');

create table test_longblob (c LONGBLOB);

INSERT INTO test_longblob (c) VALUES (X'ABCDEF1234567890');

ENUM类型

ENUM是一种字符串对象,其值从在表创建时的列定义中显式列出的允许值列表、NULL或特殊的空值('')中选择。ENUM的值在内部表示为整数。

ENUM类型从V9.0.5开始支持。

语法

ENUM('value1','value2',...)

参数

'value1','value2',...

允许值的列表。

示例

CREATE TABLE shirts (

name VARCHAR(40),

size ENUM('x-small', 'small', 'medium', 'large', 'x-large')

);

INSERT INTO shirts (name, size) VALUES ('Polo', 'large');

时间日期类型

DATE

描述

DATE是一个日期。支持的范围是 '1000-01-01' 到 '9999-12-31'。以 ‘YYYY-MM-DD' 格式显示DATE值,但允许使用字符串或数字将值赋给DATE列。

示例

CREATE TABLE td1 (d DATE);

INSERT INTO td1 (d) VALUES ('2025-11-18');

TIME

描述

TIME[(fsp)]是一个时间。范围是 '-838:59:59.000000' 到 ‘838:59:59.000000'。以 'hh:mm:ss[.fraction]' 格式显示TIME值,但允许使用字符串或数字将值赋给TIME列。fsp值的范围从0到6,用于指定小数秒的精度。值为0表示没有小数部分。如果省略,则默认精度为0。

示例

CREATE TABLE tt1 (t TIME(3));

INSERT INTO tt1 (t) VALUES ('12:30:45.123');

DATETIME

描述

DATETIME[(fsp)]是日期和时间的组合。支持的范围是 '1000-01-01 00:00:00.000000' 到 '9999-12-31 23:59:59.499999'。以 'YYYY-MM-DD hh:mm:ss[.fraction]'
格式显示DATETIME值,但允许使用字符串或数字将值赋给DATETIME列。fsp值的范围从0到6,用于指定小数秒的精度。值为0表示没有小数部分。如果省略,则默认精度为0。

示例

CREATE TABLE tdt1 (dt DATETIME(6));

INSERT INTO tdt1 (dt) VALUES ('2025-11-18 12:30:45');

TIMESTAMP

描述

TIMESTAMP[(fsp)]是一个时间戳。范围为 '1970-01-01 00:00:01.000000' UTC 到 '2038-01-19 03:14:07.499999' UTC。TIMESTAMP值以自纪元('1970-01-01 00:00:00' UTC)以来的秒数存储。TIMESTAMP无法表示值'1970-01-01 00:00:00',因为这等同于纪元后的0秒,而值0被保留用于表示 '0000-00-00 00:00:00',即”零”时间戳值。fsp值的范围从0到6,用于指定小数秒的精度。值为0表示没有小数部分。如果省略,则默认精度为0。

示例

CREATE TABLE tts1 (ts TIMESTAMP(0));

INSERT INTO tts1 (ts) VALUES ('2025-11-18 12:30:45');

YEAR

描述

YEAR是一个1字节类型,用于表示年份值。它可以声明为YEAR,默认为4个字符的显示宽度,或者等效地声明为YEAR(4),并显式指定显示宽度。YEAR[(4)]是四位数格式的年份。以YYYY格式显示YEAR值,但允许使用字符串或数字为YEAR列赋值。值的显示范围为1901到2155,或者0000。

示例

CREATE TABLE ty1 (y YEAR);

INSERT INTO ty1 (y) VALUES (2025);