目录
MySQL中的数据类型有很多,主要分为三类:数值类型、字符串类型、日期时间类型。下面通过三张表来主要介绍一下这三类数据类型。
1,数值类型
分类 | 类型 | 大小 | 有符号(SIGNED)范围 | 无符号(UNSIGNED)范围 | 描述 |
数值类型 | TINYINT | 1 byte | (-128,127) | (0,255) | 小整数值 |
SMALLINT | 2 bytes | (-32768,32767) | (0,65535) | 大整数值 | |
MEDIUMINT | 3 bytes | (-8388608,8388607) | (0,16777215) | 大整数值 | |
INT或INTEGER | 4 bytes | (-2147483648,2147483647) | (0,4294967295) | 大整数值 | |
BIGINT | 8 bytes | (-2^63, 2^63-1) | (0,2^64-1) | 极大整数值 | |
FLOAT | 4 bytes | (-3.402823466 E+38,3.402823466351 E+38) | 0和(1.175494351 E-38,3.40282346 E+38) | 单精度浮点数 | |
DOUBLE | 8 bytes | (-1.7976931348623157 E+308,1.7976931348623157 E+308) | 0和(2.22507385072014 E-308,1.7976931348623157 E+308) | 双精度浮点数 | |
DECIMAL | 依赖于M(精度)和D(标度)的值 | 依赖于M(精度)和D(标度)的值 | 小数值(精确点数) |
那么精度和标度又代表着什么意思呢?举个栗子,123.45,精度就是5,标度就是2。
当我们在常见表结构时,例如,定义age 字段,使用int类型当然可以,但是int类型占用四个字节,这时候我们就可以用tinyint,又年龄都是正的,我们还可以加个unsigned,即age tinyint unsigned。再比如当我们定义一个学生的成绩字段,我们就可以score double(4,1)。4代表成绩显示的最大长度,例100.0。1代表小数点后位数。
2,字符串类型
分类 | 类型 | 大小 | 描述 |
字符串类型 | char | 0-255 bytes | 定长字符串 |
varchar | 0-65535 bytes | 变长字符串 | |
tinyblob | 0-255 bytes | 不超过255个字符的二进制数据 | |
tinytext | 0-255 bytes | 短文本字符串 | |
blob | 0-65535 bytes | 二进制形式的长文本数据 | |
text | 0-65535 bytes | 长文本数据 | |
mediumblob | 0-16777215 bytes | 二进制形式的中等长度文本数据 | |
mediumtext | 0-16777215 bytes | 中等长度文本数据 | |
longblob | 0-4294967295 bytes | 二进制形式的极大文本数据 | |
longtext | 0-4294967295 bytes | 极大文本数据 |
注:char和varchar的区别
首先,无论是char还是varchar后面都会跟一个参数,这个参数代表着当前字符串可以存储的最大长度,如果超出50个字符将会报错。例:name varchar(50),代表name字段最大可以存储50个字符。
其次,使用char时,这里还用上面的例子,name char(50),当用户输入的字符少于50个字符时,系统会默认补空格,以达到50个字符。而使用varchar时,当用户输入多少字符,那么这个字段的长度就占用多少个字符。
最后,char的性能好,而varchar相比于char,性能就较差一些。这是因为varchar在使用的时候需要根据用户输入的字符来计算字段所占用的空间。
这里提几个问题,当定义姓名字段时,我们使用哪种类型好呢?其实varchar更好一些,因为我们的名字是不定长的。当定义性别字段时,使用哪种类型好呢?char好一些,因为性别只占一个字符,要么男要么女,况且char本身性能就比varchar好。
3,日期时间类型
分类 | 类型 | 大小 | 范围 | 格式 | 描述 |
日期类型 | date | 3 | 1000-01-01 至 9999-12-31 | YYYY-MM-DD | 日期值 |
time | 3 | -838:59:59 至 838:59:59 | HH:MM:SS | 时间值或持续时间 | |
year | 1 | 1901 至 2155 | YYYY | 年份值 | |
datetime | 8 | 1000-01-01 00:00:00 至 9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值 | |
timestamp | 4 | 1970-01-01 00:00:00 至 2038-01-19 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和时间值,时间戳 |
假如要描述一个同事的生日,这里定义一个brithday字段,最好是使用date类型。
4,案例-根据需求创建表(设置合理的数据类型、长度)
--设计一张员工信息表,要求如下
--1,编号(纯数字)
--2,员工工号(字符串类型,长度不超过10位)
--3,员工姓名(字符串类型,长度不超过10位)
--4,性别(男/女,存储一个汉字)
--5,年龄(正常人年龄,不可能存储复数)
--6,身份证号(二代身份证号均为18位,身份证中有X这样的字符)
--7入职时间(取值年月日即可)
--根据上述要求,创建表的语句如下
create table emp(
id int comment '编号',
workno varchar(10) comment '工号',
name varchar(10) comment '姓名',
gender char(1) comment '性别',
age tinyint unsigned comment '年龄',
idcard char(18) comment '身份证号',
entrydata date comment '入职时间'
) comment '员工表';