MySQL 数据类型

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 》Chapter 12 Data Types

原文地址:https://www.cnblogs.com/waynechou/p/mysql_datatype.html