一、数值类型
MySQL支持所有标准SQL中的数值类型:
包括严格数据类型(integer(int)、smallint、decimal、numeric
)
近似数值数据类型(float、real、double
)
在此基础上扩展增加(tinyint、mediumint、bigint
)3种长度不同的整型,增加了bit位类型,用来存放位数据
数值类型 | 字节 | 有符号存储范围 | 无符号存储范围 | 描述 |
tinyint | 1byte | (-128,127) | (0,255) | 小整数值 |
smallint | 2byte | (-32768,32767) | (0,65535) | 大整数值 |
mediumint | 3byte | (-2^23,(2^23)-1) | (0,16 777 215) | 大整数值 |
int(integer) | 4byte | (-2^31,(2^31)-1) | (0,4294967295) | 大整数值 |
bigint | 8byte | (-2^63,(2^63)-1) | (0,18446744073709551615) | 极大整数值 |
float(m,d) | 4byte | -3.402823466E+38到-1.175494351E-38、0和1.175494351E-38到3.402823466E+38m是数字总位数,d是小数点后的位数;若m和d别省略,根据硬件允许的限制来保存值 | 单精度浮点数值 | |
double | 8byte | -1.7976931348623157E+308到-2.22507385854072014E-308、0和2.22507385854072014E-308到1.7976931348623157E+308 | 双精度浮点数值 | |
decimal(m,d) | m指定小数点左边和右边可以存储十进制数字的最大个数,最大精度为38;d指定小数点右边可以存储的十进制数字的最大个数,小数位数必须是0~m的值,默认小数位数是0 | 定点数值 |
存储范围越小,精度越高;存储数值范围越大,精度越不准确
对于要求精度及固定小数点位数的数值存储,则采用decimal(numeric)好处在于可以自定义小数位数且精度高
若数值范围巨大,则只能用float(real)类型,但一般不提倡使用
二、字符串类型
MySQL数据库提供6种基本字符串类型:
char、varchar、binary、varbinary、blob、text
;
用来存放字符,字符串、文本、二进制字符串数据
类型 | 大小 | 描述 |
char | 0-255字节 | 定长字符串 |
varchar | 0-65535字节 | 变长字符串 |
tinyblob | 0-255字节 | 不超过255个字符的二进制字符串 |
tinytext | 0-255字节 | 短文本字符串 |
blob | 0-65535字节 | 二进制形式的长文本数据 |
text | 0-65535字节 | 长文本数据 |
mediumblob | 0-16777215字节 | 二进制形式的中等长度文本数据 |
mediumtext | 0-16777215字节 | 中等长度文本数据 |
longblob | 0-4294967295字节 | 二进制形式的极大文本数据 |
char | 0-4294967295字节 | 极大文本数据 |
varbinary(m) | 允许长度为0~m个字节的定长字符串,值的长度+1个字节 | |
binary(m) | 允许长度为0~m个字节的定长字符串 |
1、varchar和text区别:
(1)varchar可指定n,text不能指定;
(2)内部存储varchar是存入的实际字符数+1个字节(n<=255)或2个字节(n>255),text是实际字符数+2个字节;
(3)text类型不能有默认值;
(4)varchar可直接创建索引,text创建索引需指定前多少个字符;
(5)varchar的查询速度快于text,在都创建索引的情况下,text的索引似乎不起作用。
2、text和blob的区别:
(1)blob和text的存储方式不同:text以文本方式存储,blob以二进制方式存储;
(2)text英文存储区分大小写,blob不区分;
(3)blob存储的数据只能整体读出;
(4)text可以指定字符集,blob不用指定字符集。
3、binary和varbinary类似于char和varchar
不同的是它们包含二进制字符串而不要非二进制字符串。也就是说,它们包含字节字符串而不是字符字符串。这说明它们没有字符集,并且排序和比较基于列值字节的数值
三、日期时间类型
MySQL数据库提供5种日期时间类型:
date、time、year、datetime、timestamp
;
用来存储和日期时间相关的数据,每个时间类型有一个有效值范围和一个“零”值,当指定不合法的MySQL不能表示的值时使用“零”值
类型 | 字节 | 范围 | 格式 | 描述 |
date | 4byte | 1000-01-01~9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3byte | ‘-838:59:59’~‘838:59:59’ | HH:MM:SS | 时间值 |
year | 1byte | 1901~2155 | YYYY | 年份值 |
datetime | 8byte | 1000-01-01 00:00:00~9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 日期时间组合值 |
timestamp | 4byte | 1970-01-01 00:00:00~2037年某时 | YYYY-MM-DD HH:MM:SS | 时间戳 |
注意:(1)关于timestamp时间戳,当值大于2037年则会抛出异常:
四、复合数据类型
MySQL数据库提供2种复合数据类型:
enum、set
:enum单选字符串数据类型和set多选字符串数据类型。
一个enum类型只允许从一个集合中取得一个值;而set类型允许从一个集合中取得任意多个值。
类型 | 格式 | 存储大小 |
enum | enum(“value1”,“value2”,“value3”,…) | 1byte:(1-255个值);2byte:(256-65535个值) |
set | set(“value1”,“value2”,“value3”,…) | 1byte:(1-8个值);2byte:(9-16个值);3byte:(17-24个值);4byte:(25-32个值);8byte:(33-64个值) |
enum格式: enum(“value1”,“value2”,“value3”,…)
实际上,enum的选项都对应一个数字,依次是1,2,3,4,5…最多有65535个选项,使用的时候,可以使用选项的字符串格式,也可以使用对应的数字set的格式: set(“value1”,“value2”,“value3”,…)
set的每个选项值对应一个数字,依次是1,2,4,8,16…最多有64个选项,使用的时候,可以使用set选项的字符串本身(多个选项用逗号分隔),也可以使用多个选项的数字之和