1、 int类型:整形(整数类型)
整数类型 字节 最小值 最大值 tinyint 1 有符号:-128
无符号:0有符号:127
无符号:255smallint 2 有符号:-32768
无符号:0有符号:32767
无符号:65535mediumint 3 有符号:-8388608
无符号:0有符号:8388607
无符号:1677215int、integer 4 有符号:-2147483648
无符号:0有符号:2147483647
无符号:4294967295bigint 8 有符号:-9223372036854775808
无符号:0有符号:9223372036854775807
无符号:18446744073709551615
tinyint:1个字节,8位二进制
有符号:signed,最高位当做符号位,最高位为1,表示一个负数,10000000~01111111,即-128—127
无符号:unsigned,最高位当做数字使用,00000000~11111111,0—255
在 MySQL 中,
INT
类型是一个有符号整数类型,通常用于存储 -2,147,483,648 到 2,147,483,647 之间的整数(在大多数平台上,INT
占用 4 个字节,即 32 位)。但是,你提到的 -128 是一个较小的整数,它同样可以用INT
类型来存储。在二进制表示中,-128 可以表示为一个 8 位(1 字节)的补码形式。在补码表示法中,一个负数是通过取其正数的二进制表示,然后进行按位取反(即 0 变 1,1 变 0),最后加 1 来得到的。
对于 128(二进制为 10000000),按位取反后得到 01111111,然后加 1 得到 10000000。因此,-128 在 8 位二进制补码表示法中是 10000000。
如果你需要在 MySQL 中存储 -128 这个值,它会以 8 位二进制的形式存储,但是实际上在数据库中,
INT
类型会使用 32 位来存储这个值。在 32 位中,-128 的补码表示如下:11111111 11111111 11111111 10000000
这是因为最高位(符号位)是 1,表示这是一个负数,其余的位是 -128 的 8 位表示的扩展。在补码系统中,最高位的 1 被用来表示负数,其余的位则表示数值本身。
创建一个无符号位的int类型
create table <表名>(字段名 tinyint unsigned);
显示宽度(zerofill),整型显示宽度,位数不足时用0填充
create table <表名>(id int(10) zerofill primary key auto_increment);
2、 浮点数
浮点数类型 字节 最小值 最大值 float 4 ±1.175494351E-38 ±3.402823466E+38 double 8 ±2.2250738585072014E-308 ±1.7976931348623157E+308
定点整数型 字节 描述 dec(M,D),decimal(M,D) M+2 最大取值范围与double相同,给点decimal的有效取值范围有M和D决定
位类型 字节 最小值 最大值 bit(M,D) 1~8 bit(1) bit(64)
定点数的位数更长,使用方式为:
—float(M,D)
—double(M,D)
—decimal(M,D)
—M是支持多少个长度,D是小数点后的位数
create table <表名>( a float(10,2), b double(10,2), c decimal(10,2) );
3、字符串类型
字符串类型 字节 描述及存储要求 char(M) M M为0~255之间的整数 varchar(M) M为0~65535之间的整数,值的长度+1个字节 tinyblob 允许长度0~255字节,值的长度+1个字节 blob 允许长度为0~65535字节,值的长度+2个字节 mediumblob 允许长度0~16772150字节,值的长度+3个字节 longblob 允许长度0~4294967295字节,值的长度+4个字节 tinytext 允许长度0~255字节,值的长度+2个字节 text 允许长度为0~65535字节,值的长度+2个字节 mediumtext 允许长度0~16772150字节,值的长度+3个字节 longtext 允许长度0~4294967295字节,值的长度+4个字节 varbinary(M) 允许长度0~M个字节的变长字节字符串,值的长度+1个字节 binary(M) M 允许长度0~M个字节的定长字节字符串
- char 与 varchar 的区别
Type Input Saved in DB Size Desc char(5) “a” "a " 5 bytes 固定占5个字节,不足的用空格补齐 varchar(5) “a” “a” 2 bytes 字符占1个字节,额外用占1个字节记录位长 char(5) "abc " "abc " 5 bytes 保留abc后的空格,依然是5个字节 varchar(5) "abc " “abc” 4 bytes 删除结尾空格,再加上一个位长记录字节,共4个字节 char(5) “abcdefg” “abcde” 5 bytes 报错 varchar(5) “abcdefg” “abcde” 6 bytes 报错
如何选择字符串、浮点型数据的大小
根据要保存的数据的大小来确定,更大类型的数据会造成数据臃肿,存储空间占用过大,数据检索也会变慢
4、枚举类型(enum)
- 多选一的时候常使用的一种数据类型,如前端使用单选框的时候,其优点有:
—限制了可选值
—节省空间
—运行效率高
- 使用方法:
create table <表名>( name varchar(8), gender enum('男','女','保密') default '保密' )
—枚举类型的计数默认从1开始
- 集合类型(set)
- set最多有64个不同的成员,类似复选框,有多少就能选多少
create table <表名>( name varchar(32), hobby set('吃','喝','玩','唱','跳') ); insert into <表名> values('A先生','吃,唱,跳'); insert into <表名> values('B女士','吃,喝');
- 时间类型
日期和时间类型 字节 最小值 最大值 date 4 1000-01-01 9999-12-31 datetime 8 1000-01-01 00:00:00 9999-12-31 23:59:59 timestamp 4 19700101080001 2038年的某个时刻 time 3 -838:59:59 838:59:59 year 1 1901 2155
- datetime
create table datetime_demo ( create_at datetime ); insert into datetime_demo values('2024-09-08 09:33:00'); insert into datetime_demo values('2024/09/08 09:33:00'); insert into datetime_demo values(now()); ---年份最大支持4个长度 insert into datetime_demo value('10000/09/08 09:35:00'); ---报错 insert into datetime_demo values('9999/09/08 09:35:00');
- time
—时间戳类型在显示时和datetime是一样的,在存储上不同
—范围从1970-1-1 0:0:0 到2038-1-19 11:14:07
—时间戳使用4个字节表示
该值大小与存储的位长的关系为:2**(4*8-1)
create table timestamp_demo( create_time timestamp ); insert into timestamp_demo values(now()); insert into timestamp_demo values('2038-1-19 11:14:07'); ---时间戳最大值 insert into timestamp_demo values(2038-1-19 11:14:08); ---错误
- 布尔类型
—mysql中的bool类型也是0和1
create table 'bool'( cond boolean ); insert into 'bool' set cond=True; insert into 'bool' set cond=False; insert into 'bool' set cond=1; insert into 'bool' set cond=10; insert into 'bool' set cond=-1; insert into 'bool' set cond=0; insert into 'bool' set cond=0.1; insert into 'bool' set cond=127; insert into 'bool' set cond=128; ---报错 insert into 'bool' set cond='True'; ---报错
—bool类型在存储的时候是tinyint类型