mysql数据类型
mysql数据类型一、数值类型
类型 | 说明 | 例子 |
---|---|---|
tinyint | 存储范围:-128至127或0至255 | tinyint(1) |
smallint | 存储范围:-32768至32767或0至65535 | smallint(3) |
mediumint | 存储范围:- 8388608至8388607或0至16777215 | mediumint(5) |
int | 存储范围:- 2147483648至2147483647或0至4294967295 | int(10) |
bigint | 存储范围:- 9223372036854775808至9223372036854775807或0至18446744073709551615 | bigint(10) |
float(M,D) | 最小非零值:±1.175494351E – 38,同double一样适用于精度要求高的场合 | float(3,1) |
double(M,D) | 最小非零值:±2.2250738585072014E - 308 | double(10,5) |
decimal(M,D) | 取值范围可变,以来括号内的显示尺寸和小数点位数而定,适用于对精度要求不高但准确度要求非常高的场合 | decimal(10,2) |
1、整型数据
(1)、MySQL有五种整型数据列类型,即TINYINT,SMALLINT,MEDIUMINT,INT和BIGINT。它们之间的区别是取值范围不同,存储空间也各不相同。
(2)、在整型数据列后加上UNSIGNED属性可以禁止负数,取值从0开始。
(3)、声明整型数据列时,我们可以为它指定个显示宽度M(1~255),如INT(5),指定显示宽度为5个字符,如果没有给它指定显示宽度,MySQL会为它指定一个默认值。显示宽度只用于显示,并不能限制取值范围和占用空间,如:INT(3)会占用4个字节的存储空间,并且允许的最大值也不会是999,而是 INT整型所允许的最大值。
2、浮点型数据列类型
(1)、MySQL有三种浮点型数据列类型,分别是:FLOAT,DOUBLE和DECIMAL。
(2)、浮点类数据类型有一个最大可表示值和一个最小非零可表示值,最小非零可表示值决定了该类型的精确度。
(3)、MySQL 4.0.2版之后,FLOAT和DOUBLE都可以指定UNSIGNED属性。当指定该属性时,取值范围不平移到正数区间,而只是简单地把浮点类型的负数部份去掉。
(4)、浮点类型也有M(1~255)和D(1~30,且不能大于M-2)。分别表示显示宽度和小数位数。M和D在FLOAT和DOUBLE中是可选的,默认,当 MySQL版本大于3.23.6时,FLOAT和DOUBLE类型将被保存为硬件所支持的最大精度。DECIMAL的M和D值在MySQL3.23.6后可选,默认D值为0,M值为10。
3、如何选择数值类数据列类型?
(1)、为了节省存储空间和提高数据库处理效率,我们应根据应用数据的取值范围来选择一个最适合的数据列类型。如果把一个超出数据列取值范围的数存入该列,则 MySQL就会截短该值,如:我们把99999存入SMALLINT(3)数据列里,因为SMALLINT(3)的取值范围是-32768~32767,所以就会被截短成32767存储。显示宽度3不会影响数值的存储。只影响显示。
(2)、对于浮点数据列,存入的数值会被该列定义的小数位进行四舍五入。如把一个1.234存入FLOAT(6.1)数据列中,结果是1.2。
(3)、DECIMAL与FLOAT和DOUBLE的区别是:DECIMAL类型的值是以字符串的形式被储存起来的,它的小数位数是固定的。它的优点是,不会象 FLOAT和DOUBLE类型数据列那样进行四舍五入而产生误差,所以很适合用于财务计算;而它的缺点是:由于它的存储格式不同,CPU不能对它进行直接运算,从而影响运算效率。DECIMAL(M,D)总共要占用M+2个字节。
二、字符串(文本)类型
类型 | 说明 | 例子 |
---|---|---|
char | 支持固定长度的字符串, 最大长度是 255 个字符 | char(100) |
varchar | 支持可变长度的字符串, 最大长度是 65535 个字符 | varchar(1000) |
tinytext | 支持可变长度的字符串,最大长度是 255 个字符 | tinytext |
text blob |
支持可变长度的字符串,最大长度是 65535 个字符 | text |
mediumtext mediumblob |
支持可变长度的字符串,最大长度是 16777215 个字符 | mediumtext |
longtext longblob |
支持可变长度的字符串,最大长度是 4294967295 个字符 | longtext |
enum | 枚举类型,可存储最多65535 个成员,常用于取值是有限而且固定的场合 | enmu("男","女") |
set | 集合类型,可存储最多64个成员 | set("value1","value2", ...) |
1、字符串(文本)类型说明
(1)、如果把超出字符串最大长度的数据放到字符类数据列中,MySQL会自动进行截短处理。
(2)、ENUM和SET类型的数据列定义里有一个列表,列表里的元素就是该数据列的合法取值。如果试图把一个没有在列表里的值放到数据列里,它会被转换为空字符串(“”)。
(3)、字符串类型的值被保存为一组连续的字节序列,并会根据它们容纳的是二进制字符串还是非二进制字符而被区别对待为字节或者字符:
(4)、二进制字符串被视为一个连续的字节序列,与字符集无关。MySQL把BLOB数据列和带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值。
(5)、非二进制字符串被视为一个连续排列的字符序列。与字符集有关。MySQL把TEXT列与不带BINARY属性的CHAR和VARCHAR数据列里的数据当作二进制值对待。
(6)、在MySQL4.1以后的版本中,不同的数据列可以使用不同的字符集。在MySQL4.1版本以前,MySQL用服务器的字符集作为默认字符集。
(7)、非二进制字符串,即我们通常所说的字符串,是按字符在字符集中先后次序进行比较和排序的。而二进制字符串因为与字符集无关,所以不以字符顺序排序,而是以字节的二进制值作为比较和排序的依据。下面介绍两种字符串的比较方式:
(8)、二进制字符串的比较方式是一个字节一个字节进行的,比较的依据是两个字节的二进制值。也就是说它是区分大小写的,因为同一个字母的大小写的数值编码是不一样的。
(9)、非二进制字符串的比较方式是一个字符一个字符进行的,比较的依据是两个字符在字符集中的先后顺序。在大多数字符集中,同一个字母的大小写往往有着相同的先后顺序,所以它不区分大小写。
(10)、二进制字符串与字符集无关,所以无论按字符计算还是按字节计算,二进制字符串的长度都是一样的。所以VARCHAR(20)并不表示它最多能容纳20个字符,而是表示它最多只能容纳可以用20个字节表示出来的字符。对于单字节字符集,每个字符只占用一个字节,所以这两者的长度是一样的,但对于多字节字符集,它能容纳的字符个数肯定少于20个。
2、NUM和SET
(1)、ENUM和SET都是比较特殊的字符串数据列类型,它们的取值范围是一个预先定义好的列表。ENUM或SET数据列的取值只能从这个列表中进行选择。ENUM和SET的主要区别是:
(2)、ENUM只能取单值,它的数据列表是一个枚举集合。它的合法取值列表最多允许有65535个成员。例如:ENUM("N","Y")表示,该数据列的取值要么是"Y",要么就是"N"。
(3)、SET可取多值。它的合法取值列表最多允许有64个成员。空字符串也是一个合法的SET值。
(4)、ENUM和SET的值是以字符串形式出现的,但在内部,MySQL以数值的形式存储它们。
(5)、ENUM的合法取值列表中的字符串被按声明定义的顺序被编号,从1开始。
(6)、SET的编号不是按顺序进行编号的,SET中每一个合法取值都对应着SET值里的一个位。第一个合法取值对应0位,第二个合法取值对应1位,以此类推,如果数值形式的SET值等于0,则说明它是一个空字符串,如果某个合法的取值出现在SET数据列里,与之对应的位就会被置位;如果某个合法的取值没有出现在 SET数据列里,与之对应的位就会被清零。正因为SET值与位有这样的对应关系,所以SET数据列的多个合法取值才能同时出现并构成SET值。
三、时间日期类型
类型 | 说明 | 例子 |
---|---|---|
date | YYYY-MM-DD 格式表示的日期值 | date |
time | hh:mm:ss 格式表示的时间值 | time |
datetime | YYYY-MM-DD hh:mm:ss 格式表示的日期和时间值 | datetime |
timestamp | YYYYMMDDhhmmss 格式表示的时间戳值 | timestamp |
year | YYYY 格式表示的年份值 | year |
1、DATE、TIME、DATATIME数据列类型
(1)、DATE、TIME和DATATIME类型分别存放日期值、时间值、日期和时间值的组合。它们的格式分别是“CCYY-MM-DD”、“hh:mm:ss”、“CCYY-MM-DD hh:mm:ss”。
(2)、DATATIME里的时间值和TIME值是有区别的,DATATIME里的时间值代表的是几点几分,TIME值代表的是所花费的时间。当向TIME数据列插值时,需用时间的完整写法,如12分30秒要写成“00:12:30”。
2、TIMESTAMP数据列类型
(1)、TIMESTAMP数据列的格式是CCYYMMDDhhmmss,取值范围从19700101000000开始,即1970年1月1号,最大到2037年。它的特点是能把数据行的创建或修改时间记录下来:
(2)、如果把一个NULL值插入TIMESTAMP列,这个数据列就将自动取值为当前的日期和时间。
(3)、在创建和修改数据行时,如果没有明确对TIMESTAMP数据列进行赋值,则它就会自动取值为当前的日期和时间。如果行中有多个TIMESTAMP列,只有第一个会自动取值。
(4)、如果对TIMESTAMP设置一个确定的日期和时间值,则会使TIMESTAMP的自动取值功能失效。
(5)、TIMESTAMP默认的列宽是14,可指定列宽,以改变显示效果。但不论你指定的列宽如何,MySQL都是以4字节来存储TIMESTAMP值,也总是以14位精度来计算。
(6)、如果需要把创建时间和最近一次修改时间同时记录下来,可以用两个时间戳来记录,一个记录创建时间,一个记录修改时间。不过需记住两件事,一是要把记录修改时间的TIMESTAMP数据列放在最前面,这样才会自动取值;二是创建一条新记录时,要用now()函数来初始化创建时间TIMESTAMP数据列,这样,该TIMESTAMP数据列就不会再变化。
3、YEAR
(1)、YEAR是一种单字节的数据列类型,YEAR(4)的取值范围是1901~2155,YEAR(2)的取值范围是1970~2069,但只显示最后两位数。MySQL能自动把两位数字年份转换成四位数字的年份,如97和14分被转换成1997和2014。转换规则是这样的:
(2)、年份值00~69将被转换成2000~2069;
(3)、年份值70~99将被转换成1970~1999。
(4)、00被转换成0000,而不是2000。因为数值00也就是0,而0值是YEAR的一个合法取值