数值类型
1.整数类型(有符号、无符号)
整数类型 | 是否为标准sql类型 | 字节 | 有符号最小值 | 有符号最大值 | 无符号最小值 | 无符号最大值 |
tinyint | 是 | 1字节 | -128 | 127 | 0 | 255 |
smallint | -- | 2字节 | -32768 | 32767 | 0 | 65535 |
mediumint | -- | 3字节 | -8388608 | 8388607 | 0 | 1677215 |
int或integer | 是 | 4字节 | -2147483648 | 2147483647 | 0 | 4294967295 |
bigint | -- | 8字节 | -9223372036854775808 | 9223372036854775807 | 0 | 18446744073709551615 |
(1)对于整型数据,MySQL 还支持在类型名称后面的小括号内指定显示宽度,例如int(5)表示当数值宽度小于5位的时候在数字前面填满宽度,如果不指定默认为 int(11)。一般配合zerofill使用,顾名思义,zerofill就是用“0”填充的意思。以下几个例子分别描述了填充前后的区别。
drop table test;
create table test (id1 int,id2 int(5));
insert into test values(1,1);
select * from test;
| 1 | 1 |
alter table test modify id1 int zerofill;
alter table test modify id2 int(5) zerofill;
select * from test;
| 0000000001 | 00001 | -- 在命令行下起作用,在navicat 中不起作用
如果一个列指定为 zerofill,则 MySQL 自动为该列添加无符号属性。
设置了宽度限制后,如果插入大于宽度限制的值,不会对插入的数据有任何影响,还是按照类型的实际精度进行保存,这时,宽度格式实际已经没
有意义。表 test 的字段 id1 中插入数值 1,id2 中插入数值 1234567,位数为 7,大于 id2 的显示位数 5。
drop table test;
create table test (id1 int,id2 int(5));
insert into test values(1,1234567);
select * from test;
| 0000000001 | 1234567 |
(2)整数类型还有一个属性:auto_increment。在需要产生唯一标识符或顺序值时,可利用此属性。auto_increment 值一般从 1 开始,每行增加 1。在插入 null 到一个 auto_increment 列时,mysql 插入一个比该列中当前最大值大 1 的值。一个表中最多只能有一个auto_increment列。
2.浮点数类型(小数类型)
浮点数类型 | 是否为标准sql类型 | 字节 | 最小值 | 最大值 | 备注 |
float | 是 | 4字节 | ±1.75494351E-38 | ±3.402823466E+38 |
当需要精确到小数点10位以后,选择double类型。 |
double | 是 | 8字节 | ±2.2250738585072014E-308 | ±1.7976931348623157E+308 |
3.定点数类型(小数类型)
定点数类型 | 是否为标准sql类型 | 字节 | 最小值 | 最大值 | 备注 |
dec(m,d)或decimal(m,d) | 是 | m+2 | 与double相同 | 与double相同 | 该类型的取值范围和double相同,但有效值范围由m和d来决定 |
float、double数据类型存储的是近似值,而dec存储的是字符串,因此它的精度更高; 在需要表示金额等货币类型时,优先选择dec类型 |
浮点数和定点数都可以用类型名称后加“(M,D)”的方式来进行表示,“(M,D)”表示该值一共显示 M 位数字(整数位+小数位)。
定点数类型不指定精度时,默认的整数位为 10,默认的小数位为 0。
浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值 decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。
4.位类型 BIT(M)
对于 BIT(位)类型,用于存放位字段值,BIT(M)可以用来存放多位二进制数,M 范围从 1~64,如果不写则默认为 1 位。
对于位字段,直接使用 SELECT 命令将不会看到结果,可以用 bin()(显示为二进制格式)或者 hex()(显示为十六进制格式)函数进行读取。
mysql> desc test;
+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra|
+-------+--------+------+-----+---------+-------+
| id | bit(1) | YES| | NULL | |
+-------+--------+------+-----+---------+-------+
insert into test values(1);
select * from test;
+------+
| id |
+------+
| |
+------+
select bin(id),hex(id) from test;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1 | 1 |
+---------+---------+
数据插入 bit 类型字段时,首先转换为二进制,如果位数允许,将成功插入;如果位数小于实际定义的位数,则插入失败。
insert into test values(2); 报错
因为 2 的二进制码是“10”,而 id 的定义是 bit(1),所以无法插入。
alter table test modify id bit(2);
insert into test values(2);
select bin(id),hex(id) from test;
+---------+---------+
| bin(id) | hex(id) |
+---------+---------+
| 1 | 1 |
| 10 | 2 |
+---------+---------+
字符串类型
char(m) m 为 0~255 之间的整数
varchar(m) m 为 0~65535 之间的整数,值的长度+1 个字节
tinyblob 允许长度 0~255 字节,值的长度+1 个字节
blob 允许长度 0~65535 字节,值的长度+2 个字节
mediumblob 允许长度 0~167772150 字节,值的长度+3 个字节
longblob 允许长度 0~4294967295 字节,值的长度+4 个字节
tinytext 允许长度 0~255 字节,值的长度+2 个字节
text 允许长度 0~65535 字节,值的长度+2 个字节
mediumtext 允许长度 0~167772150 字节,值的长度+3 个字节
longtext 允许长度 0~4294967295 字节,值的长度+4 个字节
enum 类型
enum 中文名称叫枚举类型,它的值范围需要在创建表时通过枚举方式显式指定,对 1~255 个成员的枚举需要 1 个字节存储;对于255~65535 个成员,需要 2 个字节存储。最多允许有 65535 个成员。
create table test(sex enum('男','女','未说明性别','未知'));
insert into test values('男'),('女'),('未说明性别'),('未知');
insert into test values('1'),('2'),('3');
insert into test values(1),(2),(3);
insert into test values('0'); //插入空字符串'',不是null
insert into test values(0); //报错
insert into test values('男人');//报错
select * from test;
select * from test where sex != '';
set 类型
create table t (col set ('a','b','c','d');
insert into t values('a,b'),('a,d,a'),('a,b'),('a,c'),('a');
Set 和 ENUM 区别在于 Set 类型一次可以选取多个成员,而 ENUM则只能选一个。