mysql 浮点型详解 简书_8-MySQL数据类型

下面正式开始mysql操作学习了,基础知识点会枯燥,会无味,会焦虑,但是相信当你熟练掌握后会无比的兴奋,因为你在见证数据给这个时代带来的伟大变革,你正在见证由数据库驱动的信息革命

可以W3C菜鸟教程中查看mysql中关于数据类型的部分.

535acceb17d6

image.png

一.整型

535acceb17d6

image.png

535acceb17d6

image.png

535acceb17d6

image.png

535acceb17d6

image.png

1.整型

TINYINT 1 字节 (-128,127) (0,255) 小整数值

SMALLINT 2 字节 (-32 768,32 767) (0,65 535) 大整数值

MEDIUMINT 3 字节 (-8 388 608,8 388 607) (0,16 777 215) 大整数值

INT或INTEGER 4 字节 (-2 147 483 648,2 147 483 647) (0,4 294 967 295) 大整数值

BIGINT 8 字节 (-9 233 372 036 854 775 808,9 223 372 036 854 775 807) (0,18 446 744 073 709 551 615) 极大整数值

注意点:

- 和编程开发中的整型一样, 也区分有符号的整型和无符号的整型 unsigned, 默认就是有符号, 如果是无符号, 那么取值范围*2

- 在企业开发中也和编程开发中, 每一个字段最好使用合适的类型

+ 例如存储人的年龄, 就不要使用INT,

- 通过desc看到的数据类型后面的数值并不是占用的存储空间大小, 而是二printf一样,是位宽

+ 例如: tinyint(4) 显示的宽度是4

+ 默认宽度不会自动填充, 如果想自动填充, 必须加上zerofill

- 如果存储的值超出了取值范围, 那么会报错

示例一:

create table if not exists stu1(

id int auto_increment primary key,

score TINYINT

);

insert into stu1 values(null, 127); #不会报错

insert into stu1 values(null, 128); #会报错

示例二:

create table if not exists stu2(

id int auto_increment primary key,

score TINYINT unsigned

);

insert into stu2 values(null, 128); #不会报错

insert into stu2 values(null, 255); #不会报错

insert into stu2 values(null, 256); #不会报错

示例三:

create table if not exists stu3(

id int auto_increment primary key,

score TINYINT

);

insert into stu3 values(null, 1);

create table if not exists stu4(

id int auto_increment primary key,

score TINYINT(2) ZEROFILL

);

insert into stu4 values(null, 1);

insert into stu4 values(null, 12);

insert into stu4 values(null, 123);

---------------------极客江南

二.浮点型

535acceb17d6

image.png

535acceb17d6

image.png

535acceb17d6

image.png

2.浮点类型

FLOAT(m, d) 4 字节 单精度

DOUBLE(m, d) 8 字节 双精度

m总位数, d小数位数

- float和double的区别

+ 和编程开发中一样, 默认保留的小数位数不同

+ 和编程开发中一样, 有效精度也不同

+ 和编程开发中一样, 浮点类型是不准确的

+ 所以在企业开发中千万不要使用浮点数来保存用户的准确(珍贵)信息(RMB)

示例一:

create table if not exists stu5(

id int auto_increment primary key,

score FLOAT,

height DOUBLE

);

insert into stu5 values(null, 1.12345678901234567890, 1.12345678901234567890);

示例二:

create table if not exists stu6(

id int auto_increment primary key,

score FLOAT(3,2),

height DOUBLE(3,2)

);

insert into stu6 values(null, 1.12345678901234567890, 1.12345678901234567890);

示例三: 丢失精度

create table if not exists stu7(

id int auto_increment primary key,

score FLOAT(20,19),

height DOUBLE(20,19)

);

insert into stu7 values(null, 1.12345678901234567890, 1.12345678901234567890);

+----+-----------------------+-----------------------+

| id | score | height |

+----+-----------------------+-----------------------+

| 1 | 1.1234568357467651000 | 1.1234567890123457000 |

+----+-----------------------+-----------------------+

-----------------------极客江南

三.定点类型

535acceb17d6

image.png

3.定点类型

decimal(M, D)

m总位数, d小数位数

定点类型的本质: 是将数据分为两个部分来存储, 每个部分都是整数

所以点点数不要滥用, 因为非常消耗资源

示例三: 丢失精度

create table if not exists stu8(

id int auto_increment primary key,

score decimal(30,29),

height decimal(30,29)

);

insert into stu8 values(null, 1.12345678901234567890666, 1.12345678901234567890666);

+----+---------------------------------+---------------------------------+

| id | score | height |

+----+---------------------------------+---------------------------------+

| 1 | 1.12345678901234567890666000000 | 1.12345678901234567890666000000 |

+----+---------------------------------+---------------------------------+

---------------------------------李南江

四.字符型

535acceb17d6

image.png

535acceb17d6

image.png

535acceb17d6

image.png

注意:字符类型最好用单引号括起来,避免不必要的错误

535acceb17d6

image.png

4.字符类型

CHAR(size) 0-255字节 定长字符串

VARCHAR(size) 0-65535 字节 变长字符串

注意点: 由于是字符类型, 所以传递值只能用单引号''

4.1char(2) 和 varchar(2)的区别:

- 它们最多都只能保存2个字符

- char(2)不会回收多余的字符, 指定多少个就给我们多少个

- varchar(2)会回收多余的字符, 用多少给多少

- 由于char(2)不会回收多余的字符, 所以效率高

- 由于varchar(2)会回收多余的字符, 所以效率相对低一些

示例一:

create table if not exists stu9(

id int auto_increment primary key,

name1 char(2),

name2 varchar(2)

);

insert into stu9 values(null, 'ab', 'de');

insert into stu9 values(null, '1', '2');

insert into stu9 values(null, '123', '234'); #超出范围就会报错

示例二:

如果没有指定长度, 那么默认char就是255,varchar65535

create table if not exists stu10(

id int auto_increment primary key,

name char(255)

);

注意点: 理论上varchar最多能够存储65535个字符, 但是实际的大小和表的编码方式有关

create table if not exists stu11(

id int auto_increment primary key,

name varchar(65535)

)charset=gbk;

如果表的编码方式是UTF-8, 那么最多能够存储65535/3

Column length too big for column 'name' (max = 21845); use BLOB or TEXT instead

如果表的编码方式是GBK, 那么最多能够存储65535/2

Column length too big for column 'name' (max = 32767); use BLOB or TEXT instead

5.MySQL中每一行数据的大小限制

注意点: 在MySQL中每一行数据最多只能存储65535个字节

create table if not exists stu12(

cls char(2),

name varchar(32767) #会报错, 所有列的总大小超过了65535

)charset=gbk;

create table if not exists stu12(

cls char(2),

name varchar(32764) #只要所有列的中大小不超过65535就可以创建

)charset=gbk;

-------------------------极客江南

五.大文本型

前面讲到mysql中一行数据的大小有限制,所以如果要存入大篇幅的文章,就要引入大文本型

535acceb17d6

image.png

535acceb17d6

image.png

TINYTEXT 0-255字节 短文本字符串

TEXT 0-65535字节 长文本数据

MEDIUMTEXT 0-16777215字节 中等长度文本数据

LONGTEXT 0-4294967295字节 极大文本数据

注意点:

大文本类型在表中并不会实际占用所能保存的字节数, 而是利用10个字节引用了实际保存数据的地址

create table if not exists stu13(

cls char(2),

name LONGTEXT #不会报错, 因为没有超过一行的总大小

)charset=gbk;

--------------------------极客江南

六.枚举型

535acceb17d6

image.png

535acceb17d6

image.png

6.枚举类型

和编程开发中一样, 如果某个字段只能是固定的几个取值,并且只能是其中一个取值, 那么就可以使用枚举

和编程开发中一样, MySQL中的枚举类型本质也是整型, 但是是从1开始的

和编程开发中一样, 既然本质是整型, 所以就可以设置整型数据

create table if not exists stu14(

cls char(2),

gender enum('男', '女', '妖')

);

insert into stu14 values(null, '未知'); #会报错, 只能设置枚举中列举的值

insert into stu14 values(null, '男');

insert into stu14 values(null, '女');

select gender+0 from stu14;

insert into stu14 values(null, 1); #插入整型, 但是也必须在范围内

------------------------极客江南

七.集合类型

如果是一个多选变量,赋值给一个字段一个或者多个固定值,就不能使用枚举类型了,因为枚举类型只能一次给字段赋值一个值,这时候集合就登场了

535acceb17d6

image.png

535acceb17d6

image.png

7.集合类型

和编程开发中一样, 如果某个字段只能是固定的几个取值,并且可以是其中某几个取值, 那么就可以使用集合类型

create table if not exists stu15(

cls char(2),

hobby set('篮球', '足球', '棒球', '足浴')

);

insert into stu15 values(null, '高尔夫'); #会报错, 只能设置集合中列举的值

insert into stu15 values(null, '足球'); #插入一个值

insert into stu15 values(null, '足球,篮球'); #插入多个值

注意点: MySQL中的集合本质也是整型

insert into stu15 values(null, '篮球'); #1

insert into stu15 values(null, '足球'); #2

insert into stu15 values(null, '棒球'); #4

insert into stu15 values(null, '篮球,足球,棒球'); #7

select hobby+0 from stu15;

底层的计算公式是2(n), n从0开始

2(0) === 1;

2(1) === 2;

2(2) === 4;

1 === 0001

2 === 0010

4 === 0100

0111

-------------------------极客江南

八.日期类型

535acceb17d6

image.png

535acceb17d6

image.png

除了上述的三种类型表示日期还有时间戳TIMESTAMP但是时间戳有开始时间和结束时间,要注意

九.布尔类型

MySQL不支持真正的bool类型,使用c/c++编写的,所以非零即真

535acceb17d6

image.png

9.布尔类型

注意: MySQL不支持真正的布尔类型, 由于MySQL是用C/C++编写的, 所以非零即真

和C语言一样, ture===1 , false===0

create table if not exists stu17(

id int auto_increment primary key,

field1 boolean,

field2 boolean

);

insert into stu17 values (null, true, false);

-------------------极客江南

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值