分类 | 数据类型 | 说明 |
数值类型 | BIT(M) | 位类型,M指定位数,默认值1,范围1-64 |
TINYINT [UNSIGNED] | 带符号的范围-128~127,无符号范围0~255,默认有符号 | |
BOOL | 使用0和1表示真和假 | |
SMALLINT [UNSIGNED] | 带符号是-2^15次方 到 2^15-1,无符号是2^16-1 | |
ITN [UNSIGNED] | 带符号是-2^31次方 到 2^31-1,无符号是2^32-1 | |
BIGINT [UNSIGNED] | 带符号是-2^63次方 到 2^63-1,无符号是2^64-1 | |
FLOAT [(M, D)] [UNSIGNED] | M指定显示长度,D指定小数位数,占用4字节,MySQL在保存值时会进行四舍五入 | |
DOUBLE [(M,D)] [UNSIGNED] | 表示比float精度更大的小数,占用8字节 | |
DECIMAL (M, D) [UNSIGNED] | 定点数M指定长度,D表示小数点的位数,精度更高 | |
文本、二进制类型 | CHAR (SIZE) | 固定长度的字符串,最大长度255 |
VARCHAR (SIZE) | 可变长度字符串,最大长度65535 | |
BLOB | 二进制数据 | |
TEXT | 大文本,不支持全文索引,不支出默认值 | |
时间日期 | DATE/DATETIME/TIMESTAMP | 日期类型(yyyy-mm-dd) (yyyy-mm-dd hh:mm:ss) timestamp时间戳 |
string类型 | ENUM类型 | ENUM是一个字符串对象,其值来自创建时在列规定中显示枚举的一列值 |
SET类型 | SET是一个字符串对象,可以有零或多个值,其值来自表创建时规定的允许的一列值。指定包含多个set成员的set列值时各成员之间用逗号间隔开。这样的set成员值本身不能包含逗号 |
mysql数据类型主要有什么作用呢?
我们使用几种数据类型来感受一下
tinyint类型
create table tt1(num tinyint);
insert into tt1 values(1);
insert into tt1 values(128); -- 越界插入,报错
ERROR 1264 (22003): Out of range value for column 'num' at row 1
mysql> select * from tt1;
+------+
| num |
+------+
| 1 |
+------+
1 row in set (0.00 sec)
说明:
- 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。
- 可以通过UNSIGNED来说明某个字段是无符号的
float类型
小数:flfloat(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。
create table tt2(id int, salary float(4,2));
insert into tt2 values(10, -99.99);
insert into tt2 values(11, -99.991);
insert into tt2 values(12, -99.996); -- 越界插入,报错
insert into tt2 values(13, -99.998); -- 越界插入,报错
select * from tt2;
+------+--------+
| id | salary |
+------+--------+
| 10 | -99.99 |
| 11 | -99.99 |
+------+--------+
当我们的float(4,2)如果是一个有符号的,则表示范围是-99.99 ~ 99.99,如果flfloat(6,3),范围是多少?很简单范围为-999.999 ~ 999.999。
char类型
create table tt3(id int, name char(2));
insert into tt3 values(10, 'aa');
insert into tt3 values(11, '北京');
insert into tt3 values(12, '北京人'); -- 越界插入,报错
select * from tt3;
+------+--------+
| id | name |
+------+--------+
| 10 | aa |
| 11 | 北京 |
+------+--------+
说明:char(2) 表示可以存放两个字符,可以是字母或汉字,但是不能超过2个, 最多只能是255。
create table tt4(id int ,name varchar(6)); --表示这里可以存放6个字符
insert into tt4 values(10, 'hello');
insert into tt4 values(11, '你好啊,小明');
select * from tt4 ;
+------+--------------------+
| id | name |
+------+--------------------+
| 10 | hello |
| 11 | 你好啊,小明 |
+------+--------------------+
说明
关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
- varchar长度可以指定为0到65535之间的值,但是有1 - 3 个字节用于记录数据大小,所以说有效字节数是 65532。
- 当我们的表的编码是utf8时,varchar(n)的参数n最大值是65532/3=21844[因为utf中,一个字符占用3个字节],如果编码是gbk,varchar(n)的参数n最大是65532/2=32766(因为gbk中,一个字符占用2字节)。
char和varchar比较
实际存储 | cahar(4) | varchar(4) | char占用字节 | varchar占用字节 |
abcd | abcd | abcd | 4*3=12 | 4*3+1=13 |
ab | ab | ab | 4*3=12 | 2*3+1=7 |
abced | 数据长度过长 | 数据长度过长 |
如何选择定长或变长字符串?
- 如果数据确定长度都一样,就使用定长(char),比如:身份证,手机号,md5
- 如果数据长度有变化,就使用变长(varchar), 比如:名字,地址,但是你要保证最长的能存的进去。
- 定长的磁盘空间比较浪费,但是效率高。
- 变长的磁盘空间比较节省,但是效率低。
- 定长的意义是,直接开辟好对应的空间
- 变长的意义是,在不超过自定义范围的情况下,用多少,开辟多少。
从上面的数据类型使用中我们可以看出,当我们设定好一种数据类型的时候。就必须遵守该数据类型所对应的语法规则以及取值范围,一旦你进行任何违规操作如越界插入sql就会立刻报错并且终止你的本次插入,由此看来数据类型的本质其实就是一种约束,由此来保证数据的安全。sql为了保证数据安全还有其他一些策略如表的约束我们在后序文章中会提到。