MySql----数据类型(数值类型、char/varchar、enum、set、date)

一:数据类型分类:

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第1张图片
二:数值类型

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第2张图片
1.bit

bit[(M)] : 位字段类型。M表示每个值的位数,范围从1到64。如果M被忽略,默认为1。

例:

//表tt3的sno的值有8个位
mysql> create table tt3(age int,sno bit(8));
//插入数据
mysql> insert into tt3 values(10,24);
//查询数据  sno的值24并不是24
mysql> select * from tt3;

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第3张图片
是因为bit字段在显示时,是按照ASCII码对于的值显示。验证如下:

//65是A的ASCII码
insert into tt3 values(11,65);

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第4张图片
如果需要字段值用10进制显示:

//这样sno字段数据以十进制显示:
mysql select  sno+0 from tt3;

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第5张图片
字段值以16进制显示:

mysql  select  hex(sno) from tt3;

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第6张图片
如果需要字段值以8进制显示:

mysql> select  oct(sno) from tt3;

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第7张图片
但是mysql使用上述函数时无法使用索引。
字段值以二进制显示:

mysql> select  bin(sno) from tt3;

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第8张图片
当一个字段只存放0或1,可以采用bit类型:

//bit默认1位
mysql> create table tt4(judge bit);
mysql> insert into tt4 valus(0);
mysql> insert into tt4 values(1);

插入数据为2时,会出现错误:
在这里插入图片描述
2.tinyint

tinyint默认为有符号为1个字节,那么取值范围是-128-127,如果数据大于127就会越界:
在这里插入图片描述
在MySQL中,整型可以指定为有符号和无符号,如果没有指定,默认为有符号,但是可以通过UNSIGNED来指定某个字段是无符号的。
添加一个新字段age2,为tinyint unsigned:

mysql> alter table tt2 add age2 tinyint unsigned  ;
mysql> insert into tt2(ag2) values (128);

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第9张图片

我们知道无符号和有符号相差一个数量级,如果有符号int超范围,int unsigned同样可能存放不下,所以在设计时数据过大,可以设计为bigint。
3.小数类型(float/decimal)

float[(m, d)] [unsigned] : m指定显示长度,d指定小数位数,占用空间4个字节

有符号float:
float(4,2)表示的范围是-99.99 ~ 99.99,MySQL在保存值时会进行四舍五入。

//area值是4位数,小数位2位
mysql> create table tt5(area float(4,2));
//会进行四舍五入
mysql> insert into tt5 values(99.991);
mysql> insert into tt5 values(99.985);

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第10张图片
无符号float
float(4,2) unsigned 这时,因为把它指定为无符号的数,范围是 0 ~ 99.99。

mysql> create table tt6(area float(4,2) unsigned);
mysql> insert into tt6 values(-1);

在这里插入图片描述
decimal

decimal(m, d) [unsigned] : 定点数m指定长度,d表示小数点的位数
  • decimal(5,2) 表示的范围是 -999.99 ~ 999.99
  • decimal(5,2) unsigned 表示的范围 0 ~ 999.99

float和decimal的区别在于精度不同

mysql> create table tt7(area float(10,8),salary decimal(10,8));
mysql> insert into tt7 values(53.12345678,53.12345678);

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第11张图片

  1. 可以发现decimal的精度更高,float的精度大约是7位,如果希望某个数据表示高精度,可以选择decimal。
  2. decimal整数最大位数m为65,支持小数最大位数d是30。如果d被省略,默认为0,如果m被省略,默认是10。
  3. decima 按照字符串形式存储,以解决精度问题,但是在性能上,处理速度较慢。

三.字符串类型

char

语法:

char(L): 固定长度字符串,L是可以存储的长度,单位为字符,最大长度值可以为255
//char(2)代表可以存储的长度为2
mysql> create table tt8 (name char(2));
mysql> insert into tt8('ab');
mysql> insert into tt8 values('中国');

char(2)表示可以存放2个字符,可以是字母或者汉字,但是不能超过2个,最多只能是255;
在这里插入图片描述
varchar

mysql> create table tt9 (name char(256));
mysql> insert into tt10 values("hello");
mysql> insert into tt10 values("中国,你好!");

关于varchar(len),len到底是多大,这个len值,和表的编码密切相关:
varchar的最大长度是65535。
但是MySql限定行的最大值是65535字节(byte),注意,这是行的最大长度,包括一行中所有列的长度总和,但是但是有1 - 2 个字节用于记录数据大小,所以说有效字节数是65533。
对于char,不论采用哪一种字符集(utf8mb4一个字符4个字节),255的长度都不会超过mysql 65535字节的限制。然而对于varchar,字符集的大小就会对实际长度产生影响:
当我们的表的编码是utf8时,varchar(n)的参数n最大值是65533/3=21844(因为utf中,一个字符占用3个字节),如果编码是gbk,varchar(n)的参数n最大是65533/2=32766(因为gbk中,一个字符占用2字节)。
如何选择定长或变长?
首先了解下什么是变成定长:
变长定长区别体现在存储方式上。char 作为定长类型,假设定义 char(10),我们存入’中国’,只占用了2个字符数,那么后面8个字符,存储引擎会填充空格。反之varchar(10),不会自动填充空格。即varchar是变长。

  • 如果数据确定长度都一样,使用定长(char),如:身份证号码,电话号码等;
  • 如果数据长度有变化,使用变长(varchar),如名字,地址,但是要保证最长的能存进去;
  • 定长的磁盘空间比较浪费,但是效率高;
  • 变长的磁盘空间比较节省,但是效率低;

日期和时间类型

日期

  • datetime时间日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范围从1000到9999,占用八字节;
  • data:日期 ‘yyyy-mm-dd’,占用三字节;
  • timestamp:时间戳,从1970年开始的 yyyy-mm-dd HH:ii:ss格式和datetime完全一致,占用四字节.
mysql> create table tt11(t1 date,t2 datetime,t3 timestamp);
mysql> insert into tt11(t1,t2)  values ('2000-1-1','2008-12-7 8:1:1');
mysql> insert into tt11(t1,t2)  values ('2009-1-1','2018-12-7 10:19:0');

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第12张图片
如果没有指定时间戳,时间戳默认为当前时间。
enum和set

enum

语法:

//enum是单选
enum('选项1','选项2','选项3',...);

提供了若干选项的值,一次只能选择一个,和c里的枚举一样,每个选项实际存储的是数字,1,2,3,4…最大65535。
set

语法:

//set是多选
set('选项值1','选项值2','选项值3', ...);

set里提供了若干选项的值,一次可以有多个选项,每个选项值实际存储的是数字,1,2,4,8,16…最大是64。
尽管enum和set存储的数字,但是在添加数据时,最好用具体含义,可读性强。

例:调查男生女生喜欢的颜色(粉色,果绿,紫色);

//创建表
mysql> create table tt12(
    -> name varchar(20),
    -> colour set('粉红','果绿','紫色'),
    -> sex enum('male','female'));
mysql> insert into tt12 values("pick","紫色","male");
mysql> insert into tt12 values("sophia",'紫色,果绿',"male");

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第13张图片
查询所有喜欢紫色的信息:

mysql> select * from tt12 where colour='紫色';

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第14张图片
只查询到唯一喜欢紫色的信息,并没有把喜欢紫色同学信息全部查询到,所以用到了find_ in_ set。

集合查询使用find_ in_ set函数:
find_in_set(sub,str_list) :如果 sub 在 str_list 中,则返回下标;如果不在,返回0; str_list 用逗号分隔的字符串。

mysql> select * from tt12 where find_in_set('紫色',colour);

MySql----数据类型(数值类型、char/varchar、enum、set、date)_第15张图片

你可能感兴趣的:(数据库)