总结MySQL的数据类型

1,095 阅读4分钟

1. 整数类型

类型 字节数 最小值 最大值
TINYINT 1 -128 127
SMALLINT 2 -2^15 2^16 - 1
MEDIUMINT 3 -2^23 2^24 - 1
INT 4 -2^31 2^31 - 1
BIGINT 8 -2^63 2^63 - 1

2. 定点数

price DECIMAL(5, 2)

5代表十进制数字总的位数,2表示小数点后面的位数。所以范围为(-999.99, 999.99)

每9个十进制数字用4个字节表示。

999999999 --> ‭0011 1011 1001 1010 1100 1001 1111 1111‬

每个值的整数和分数部分的存储分别确定。每个9位数的倍数需要4个字节,并且“剩余的”位需要4个字节的一部分。

3. 浮点数

FLOAT(M,D) 、 REAL(M,D) 、 DOUBLE PRECISION(M,D)

4. BIT

BIT(M)

BIT(M)类型允许存储M位值

M范围为1-64,默认为1

5. 字符串

  1. CHAR / VARCHAR

    CHAR和VARCHAR类型声明的长度表示你想要保存的最大字符数。它是一个长度,编码集不同,每个字符长度也不同,所以后面的参数允许的最大值也不同。例如,CHAR(30)可以占用30个字符。默认长度都为255。

    ​ CHAR列的长度固定为创建表时声明的长度。长度可以为从0到255的任何值。当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉,所以,我们在存储时字符串右边不能有空格,即使有,查询出来后也会被删除。

    ​ VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值(实际可指定的最大长度与编码和其他字段有关,比如,使用utf-8编码格式,大小为标准格式大小的2倍,仅有一个varchar字段时实测最大值仅21844,如果添加一个char(3),则最大取值减少3。整体最大长度是65,532字节)。innodb规定至少一页要存储两行以上的数据,而页的大小是固定的。

    ​ 同CHAR对比,VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。

    ​ VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。

    ​ 如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

  2. BINARY/VARBINARY BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集,并且排序和比较基于列值字节的数值值。

    当保存BINARY值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '会变成'a \0'。

    对于VARBINARY,插入时不填充字符,选择时不裁剪字节。比较时所有字节很重要。

    当类型为BINARY的字段为主键时,应考虑上面介绍的存储方式。

  3. BLOB和TEXT类型

BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。

有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。

BLOB列被视为二进制字符串。TEXT列被视为字符字符串,类似CHAR和BINARY。

  1. ENUM和SET
  1. size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
  2. gender SET('男', '女')

MySql中的ENUM和SET是一个字符串对象,其值来自表创建时在列规定中显式枚举的一列值。

SET最多64个值。ENUM最多可以有65,535个元素。

6. 时间日期

Data Type Zero Value
DATE '0000-00-00'
TIME '00:00:00'
DATETIME '0000-00-00 00:00:00'
TIMESTAMP '0000-00-00 00:00:00'
YEAR 0000

任意的分隔符都有效, ‘1998-06-29’ 和 ‘1998/05/22’都会在写入后统一格式。