整型数据
以TINYINT为例(其他整型数据类似):
创建字段类型为TINYINT(1)
,则该字段可以取到的有符号整型最小值:-128
,最大值:127
。-129和128都是越界值,插入时会报错。
创建TINYINT(2)
的字段,进行测试同样取最小值:-128,最大值:127。由于TINYINT默认只占用1个字节,所以即使声明为2个字节大小,也只能存储一个字节的值。
PS:一个字节(bytes) = 八位(bits)。八位可以表示无符号整数:2^8 - 1 = 256 - 1 = 255,即表示 0-255 范围的数字大小。
浮点和定点数据类型
浮点数分为两种:单精度浮点类型(FLOAT)和双精度浮点类型(DOUBLE)。
定点数类型为:DECIMAL
浮点数类型和定点数类型都可以用(M,N)来表示。其中,M称为精度
,表示总共的位数;N称为标度
,表示小数的位数。
以FLOAT(5,3)
为例:其值在数据库中为55.0001,则在查询时因为M精度的设置,只能显示5位数字,因此该值会被四舍五入
为:55.000,同理若为55.0006,则会四舍五入为55.001。
此外:FLOAT和DOUBLE存储的是近似值,而DECIMAL存储的是字符串,所以会不对数值进行四舍五入,因此精确度更高(例如:DECIMAL(5,3),其值设置为55.0001和55.0009都会显示55.000)。
在定义商品价格之类的类型时,使用FLOAT足以。
日期与时间类型
……
字符串类型
CHAR(M)
和VARCHAR(M)
表示在创建表时指定的存储字符串的最大长度为M。
CHAR类型
是固定长度的。取值范围为:0-255之间的任意值,设置成功后长度不变(即占用存储空间大小被固定)
VARCHAR类型
是变长的。取值范围为:0-65535之间的任意值,设置最大值之后,其存储空间根据字符串长度进行变化。例如:VARCHAR(10),但是只占用了5个字节的大小,因此该字段的空间只占用5+1个字节,最后一个字节位结束标识符。
对CHAR和VARCHAR的取值范围进行测试,定义CHAR(5)和 VARCHAR(5)只能存储一个字节大小的数据。
CHAR(5) | 占用字节 | VARCHAR(5) | 占用字节 |
---|---|---|---|
""(空字符串) | 5 | ""(空字符串) | 1 |
"ab1" | 5 | "数字1" | 4 |
"12345" | 5 | "12345" | 6 |
"插入六个汉字" | 越界禁止插入 | "插入1234" | 越界禁止插入 |
TEXT类型
TEXT类型是一种特殊的字符串类型,其中汉字占用3字节,数字字母占用1字节。包括:TINYTEXT,TEXT,MEDIUMTEXT,LONGTEXT
类型 | 允许的长度 | 存储空间 |
---|---|---|
TINYTEXT | 0-255字节 | 值的长度+2个字节 |
TEXT | 0-65535字节 | 值的长度+2个字节 |
MEDIUMTEXT | 0-16772150字节 | 值的长度+3个字节 |
LONGTEXT | 0-4294967295字节(2^32-1 = 4G) | 值的长度+4个字节 |
PS:UTF-8对字符串编码,一个汉字占用3个字节,一个字母和数字占用1个字节(mysql配置启用UTF-8编码)
TINYTEXT默认取值255不可更改大小,因此TINTEXT可以存储255个英文字母,85个汉字。
其余类型可以取固定存储长度。
ENUM类型
ENUM是一个字符串对象,其值为表创建时在列规定中枚举的一列值。语法格式如下:
字段名 ENUM ('值1’,'值2',…… '值n')
其中,“字段名”指将要定义的字段,“值n”指枚举列表中的第n个值。ENUM类型的字段在取值时,只能在指定的枚举列表中取,而且一次只能取一个。创建的成员中有空格时,其尾部的空格将自动被删除。ENUM值在内部用整数表示,并且每个枚举值均有一个索引值:列表值所允许的成员值从1开始编号,MySQL存储的就是这个索引编号。枚举最多可以有65535个元素。
例如,定义ENUM类型的列(' first','second','third')该列可以取的值和每个值的索引如表5.7所示。
SET类型
SET是一个字符串对象,可以有零或多个值。SET列最多可以有64个成员,其值为表创建时规定的一列值。指定包括多个SET成员的SET列值时,各成员之间用逗号()间隔开。语法格式如
SET ('值1','值2',……,'值n')
与ENUM类型相同,SET值在内部用整数表示,列表中每一个值都有一个索引编号。当创建表时,SET成员值的尾部空格将自动被删除。
二进制数据类型
BIT类型
BIT类型是位字段类型。M表示每个值的位数,范围为1~64。如果M被省略,默认为1。如果为BIT(M)列分配的值的长度小于M位,就在值的左边用0填充。例如,为BIT(6列分配一个值b'l01’,其效果与分配b'000101相同。BIT数据类型用来保存位字段值。例如,以二进制的形式保存数据13(13的二进制形式为1101),在这里需要位数至少为4位的BIT类型,即可以定义列类型为BIT(4),大于二进制1111的数据是不能插入BIT(4)类型的字段中的。
BINARY和 VARBINARY类型类
BINARY和 VARBINARY类型类似于CHAR和 VARCHAR,不同的是它们包含二进制字节字符串。其使用的语法格式如下:列名称 BINARY(M)或者 VARBINARY(M)
BINARY类型的长度是固定的,指定长度之后,不足最大长度的,将在它们右边填充“0’补齐以达到指定长度。例如:指定列数据类型为 BINARY(3),当插入a’时,存储的内容实际为“a00”,当插入“ab”时,实际存储的内容为“ab0”,不管存储的内容是否达到指定的长度,其存储空间均为指定的值M VARBINARY类型的长度是可变的,指定好长度之后,其长度可以在0到最大值之间。例如:指定列数据类型为 VARBINARY(20),如果插入的值的长度只有10,则实际存储空间为10加1,即实际占用的空间为字符串的实际长度加1。
BLOB类型
BLOB列存储的是二进制字符串(字节字符串),TEXT列存储的是非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值;TEXT列有一个字符集,并且根据字符集对值进行排序和比较。
BLOB列存储的是二进制字符串(字节字符串),TEXT列存储的是非二进制字符串(字符字符串)。BLOB列没有字符集,并且排序和比较基于列值字节的数值;TEXT列有一个字符集,并且根据字符集对值进行排序和比较。
与ENUM类型不同的是,ENUM类型的字段只能从定义的列值中选择一个值插入,而SET类型的列可从定义的列值中选择多个字符的联合。
如果插入SET字段中列值有重复,则 MySQL自动删除重复的值;插入SET字段的值的顺序并不重要,MySQL会在存入数据库时按照定义的顺序显示;如果插入了不正确的值,默认情况下,MySQL将忽视这些值,并给出警告