MySQL 的数据类型包括:
- 数字类型(Numeric Type)
- 日期和时间类型(Date and Time Type)
- 字符串类型(String Type)
一、 数字类型(Numeric Type)
我们用 M 表示整数类型的最大显示宽度,最大的显示宽度是255,显示宽度与数据类型能表示的范围无关。
数字类型允许 UNSIGNED(无符号,大于等于0) 和 SIGNED(有符号,默认) 的属性。
SERIAL 是 BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE 的别名,你可以这样创建表:
create table b(a serial);show create table b;+-------+--------------------------------------------------------------------------------------------------------------------------------------+| Table | Create Table |+-------+--------------------------------------------------------------------------------------------------------------------------------------+| b | CREATE TABLE `b` ( `a` bigint(20) unsigned NOT NULL AUTO_INCREMENT, UNIQUE KEY `a` (`a`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 |+-------+--------------------------------------------------------------------------------------------------------------------------------------+
BIT(M):M 取值 1到64,默认为1 。以二进制格式插入:
> insert into bit values (b'110000');> select bin(a),a+0,a from bit;+--------+------+------+| bin(a) | a+0 | a |+--------+------+------+| 110000 | 48 | 0 |+--------+------+------+
注:bit(8) 占用空间比 tinyint 少,但 bit 不能存储负数。
TINYINT[(M)] [UNSIGNED] [ZEROFILL],signed 取值:-128到127,unsigned 取值:0到255 。
BOOL, BOOLEAN:布尔类型,此类型跟 TINYINT(1)的同义。 值为0被认为是错误的,非0值被认为是正确的。TRUE=1 and FALSE=0,其他值既不等于true也不等于false。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
INT[(M)] [UNSIGNED] [ZEROFILL]
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
FLOAT(p) [UNSIGNED] [ZEROFILL]
二、 日期和时间类型(Date and Time Type)
DATE The supported range is '1000-01-01' to '9999-12-31'. MySQL displays DATE values in 'YYYY-MM-DD' format.
DATETIME[(fsp)] fsp:fractional seconds part 秒的小数部分。The supported range is '1000-01-01 00:00:00.000000' to '9999-12-31 23:59:59.999999'. MySQL displays DATETIME values in 'YYYY-MM-DD HH:MM:SS[.fraction]' format
TIMESTAMP[(fsp)] A timestamp. The range is '1970-01-01 00:00:01.000000' UTC to '2038-01-19 03:14:07.999999' UTC.
TIME[(fsp)] The range is '-838:59:59.000000' to '838:59:59.000000'. MySQL displays TIME values in 'HH:MM:SS[.fraction]' format
YEAR[(4)] MySQL displays YEAR values in YYYY format,Values display as 1901 to 2155, and 0000.
三、 字符串类型(String Type)
[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name] 固定长度的字符串,存储时用空格填充。 The range of M is 0 to 255. If M is omitted, the length is 1. M 表示可以存储的字符的个数(M represents the column length in characters),在utf8mb4字符集下,一个汉字是一个字符,即char(4) 可以存储4个字符或4个汉字。
一个汉字占多少长度与编码有关:
- UTF8:一个汉字=3个字节
- GBK:一个汉字=2个字节
[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name] 一个可变长度的字符串。 M代表以字符计算的最大列长度。 M的范围是0到65,535。 VARCHAR的有效最大长度取决于最大行大小(65,535字节,在所有列中共享)和使用的字符集。 例如,utf8字符每个字符最多可能需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多21,844个字符。varchar(n) 表示n个字符,无论汉字和英文,Mysql都能存入n个字符,仅是实际字节长度有所区别。
BINARY(M) BINARY类型与CHAR类型相似,但存储二进制字节字符串而不是非二进制字符串。 M表示以字节为单位的列长度。如 binary(2) ,utf8 字符集,不能存储 1 个汉字,因为utf8字符集下一个汉字需要3个字节。
VARBINARY(M) VARBINARY类型类似于VARCHAR类型,但是存储二进制字节字符串而不是非二进制字符串。 M表示以字节为单位的最大列长度。
TINYBLOB 最大存储255个字节,每个TINYBLOB值都使用一个1字节长度的前缀来存储该值所占的字节数。
TINYTEXT 最大存储255个字符,每个TINYTEXT值都使用一个1字节长度的前缀来存储该值所占的字节数。
BLOB[(M)] 最大存储65,535(2^16 − 1)个字节,每个BLOB值都使用一个2字节长度的前缀来存储该值所占的字节数。
TEXT[(M)] 最大存储65535(2^16 − 1)个字符,每个TEXT值都使用一个2字节长度的前缀来存储该值所占的字节数。
MEDIUMBLOB 最大存储16,777,215(2^24 − 1)个字节,每个BLOB值都使用一个3字节长度的前缀来存储该值所占的字节数。
MEDIUMTEXT 最大存储16,777,215(2^24 − 1)个字符,每个TEXT值都使用一个3字节长度的前缀来存储该值所占的字节数。
LONGBLOB 最大存储4GB(2^32 − 1)个字节,每个BLOB值都使用一个4字节长度的前缀来存储该值所占的字节数。
LONGTEXT 最大存储4GB(2^32 − 1)个字符,每个TEXT值都使用一个4字节长度的前缀来存储该值所占的字节数。
ENUM('value1','value2',...) 枚举类型,只能从列表中选一个值。如 info enum('6','男','34','女'),只能在 info 列插入 '6','男','34','女' 这4个值,也可以用数组方式插入,如values(1)表示values('6'),values(4)表示values('女'),values(5)则会报错。
SET('value1','value2',...) 集合,可以有0个或多个值(最多64的不同的members),必须从列表中('value1','value2',...)选择。
参考: 《 refman-5.7 》