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. 字符串
-
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模式禁用值的插入。
-
BINARY/VARBINARY BINARY和VARBINARY类型类似于CHAR和VARCHAR类型,但是不同的是,它们存储的不是字符字符串,而是二进制串。所以它们没有字符集,并且排序和比较基于列值字节的数值值。
当保存BINARY值时,在它们右边填充0x00(零字节)值以达到指定长度。取值时不删除尾部的字节。比较时所有字节很重要(因为空格和0x00是不同的,0x00<空格),包括ORDER BY和DISTINCT操作。比如插入'a '会变成'a \0'。
对于VARBINARY,插入时不填充字符,选择时不裁剪字节。比较时所有字节很重要。
当类型为BINARY的字段为主键时,应考虑上面介绍的存储方式。
-
BLOB和TEXT类型
BLOB是一个二进制大对象,可以容纳可变数量的数据。有4种BLOB类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们只是可容纳值的最大长度不同。
有4种TEXT类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些对应4种BLOB类型,有相同的最大长度和存储需求。
BLOB列被视为二进制字符串。TEXT列被视为字符字符串,类似CHAR和BINARY。
- ENUM和SET
- size ENUM('x-small', 'small', 'medium', 'large', 'x-large')
- 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’都会在写入后统一格式。