数据类型
数据类型分类
数值类型
类型 | 字节 | 最小值 | 最大值 |
---|---|---|---|
(带符号/无符号) | (带符号/无符号) | ||
TINYINT | 1 | -128(-2^7) | 127(2^7-1) |
0 | 255(2^8-1) | ||
SMALLINT | 2 | -32768(-2^15) | 32767(2^15-1) |
0 | 65535(2^16-1) | ||
MEDIUMINT | 3 | -8388608 | 8388607 |
0 | 16777215 | ||
INT | 4 | -2147483648 | 2147483647 |
0 | 4294967295 | ||
BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
0 | 18446744073709551615 |
在MySQL中,整形是可以指定是有符号和无符号,默认是有符号的。
通过UNSINGNED来表明字段是无符号的
1
mysql> create table tt2(num tinyint unsigned);
- 注意:尽量不要使用unsingned,对于int来兴可能放不下的数据,unsingned int同样可能存放不下,还不如在设计时将int提升为bigint类型,但是对于优化器而言,unsingned确实有一定的用处,比如当你要查询的数据为负数时,unsingned会直接返回,并不会进行查询。
bit类型
语法:
1
bit[(M)]:位字段类型。M表示每个值的位数,范围从1到64.如果M被忽略,默认为1
范例:
1
mysql> create table tt2 (id int,a bit(64));
bit字段在显示时,是按照ASCII码对应的值显示。
1
2
3
4
5
6
7
8mysql> insert into tt2 values(65,65);
Query OK, 1 row affected (0.11 sec)
mysql> select * from tt2;
+------+----------+
| id | a |
+------+----------+
| 65 | A |
+------+----------+如果我们只需要在表中存放0或1,这时就可以定义bit(1)。这样就可以节省空间。
1
mysql> create table tt3 (a bit(1));
使用十进制形式查看表中数据
- 语法:
1
select 字段名称+0 from 表名称:
1
2
3
4
5
6mysql> select a+0 from tt2;
+------+
| a+0 |
+------+
| 65 |
+------+使用其它方式产看表中数据
- 二进制查看表中数据
1
select bin(字段名称) from 表名称;
- 八进制查看表中数据
1
select oct(字段名称) from 表名称;
- 十六进制查看表中数据
1
select hex(字段名称) from 表名称;
注意:使用以上函数查看表中数据存储的数据类型时,是不能食用引索查询的
小数类型
float:
语法:
1
float[(m,d)][unsigned]:m定点数指定显示长度,d指定小数位数,占用空间4个字节
float(4,2)表示的范围是:-99.99~99.99,MySQL在保存值会进行四舍五入
1
mysql> create table tt4 (id int,a float(4,2) unsigned);
关于符号问题:
当将数据定义为float(4,2) unsingned时,由于是无符号,范围是0~99.99
当向表中插入一个负数时,比如-0.1,就会直接保存(超出范围),而不是进行四舍五入
- 但是当我们要强制将数插入到表中时,可以使用如下语法:
1
insert ignore into 表名称 values(id:100,data:-0.1);
范例:
1
2
3
4
5
6
7
8mysql> insert ignore into tt4 values(100,-0.1);
Query OK, 1 row affected, 1 warning (0.14 sec)
mysql> select * from tt4;
+------+------+
| id | a |
+------+------+
| 100 | 0.00 |
+------+------+
decimal:
语法:
1
decimal(m,d) [unsigned]:定点数m指定长度,d指定小数位数
decimal与float的区别:
- 精度不一样:float表示的进度大约是小数点后7位,高于7位就有可能造成进度的丢失(关于精度丢失,由于二进制小数点一直不能乘到1,小数点后面总会有数字),decimal表示的精度更加准确,M最大为65,D最大为30,它是将数值以字符串的形式存储的。
- 建议:如果希望小数的精度高,推荐使用decimal
字符串类型
char:
语法:
1
char(L):固定长度字符串,L是可以存储的长度,单位为字符,最大长度可以为255
- 注意:char最多规定255个字符长度
varchar:
语法:
1
varchar(L):可变长度字符串,L表示字符长度,最大长度65535个字节
关于varchar(len),len到底为多大,该len值和标的编码密切相关:
varchar长度可以指定为0~65535之间的值,但是其中有1~2个字节用于记录数据大小
当使用表的编码是utf8时,varchar(n)的参数n最大值为65535/2=21844(因为utf8中,每个每个字符占用3个字节),如果编码为gbk,varchar(n)的参数n最大值为65535/2=32766(在gbk编码中,一个字节占用2个字节)。
1
mysql> create table tt6(name varchar(21844)) charset=utf8;
char和varchar比较
实际存储 | char(4) | varchar(4) | char占用字节 | varchar占用字节 |
---|---|---|---|---|
abcd | abcd | abcd | 4*3=12 | 4*3+1=13 |
A | A | A | 4*3=12 | 1*3+1=4 |
Abcde | × | × | 数据超出长度 | 数据超出长度 |
如何选择定长或变长字符串?
如果数据长度都一样,就使用定长(char),比如:身份证,手机号,md5
md5是一种加密方法,加密后的数据是不能逆行使用的,也就是说要查看用户密码信息,需要通过数据查询匹配来实现
1
2
3
4
5
6
7如果数据库表User中有一列为passwd,存放的是md5加密的数据,如何更新新的数据。
update user set passwd=md5("123321") where uName="lihua";
插入新的数据:
insert into user(uName,passwd) values("xiaoqiang",md5("123321")) ;
这样存放在数据中的密码信息就是保密存放的,但是通过md5加密后的数据是不能逆向使用的,也就是说如果查看用户的密码信息,则需要通过数据查询匹配来实现。
比如需要进行用户身份认证,则需要执行下面查询语句:
select * from user where uName="lihua" and passwd=md5("123321");
如果数据有变化,就用变长(varchar),比如:名字,地址,但是你保证最长的数据能够存进去
定长的磁盘空间比较浪费,但是效率高
变长的磁盘空间比较节省,但是效率低
注意:temp会根据varchar最大长度去创建临时表