mysql的数据类型

字符集(charset)

字符集:可见字符在保存和传输的时候对应的二进制代码集合。

通常在以下两种情况用到:
1.保存数据
2.数据传输

create table test(
	name varchar(10) charset utf8
)charset=gbk;

gbk,gb2312,utf8区别:
  他们都是常用的字符编码方式,gbk和gb2312(自带)是简体中文的编码,而utf8是国际通用编码。
在python中:
  gbk,gb2312:一个中文占用2个字节,在mysql中可以存65535/2-1个字符
  utf8:一个中文占用3个字节,在mysql中可以存65535/3-1个字符。
在数据库中:
  gbk,gb2312:一个汉字的字节长度是2;
  utf8:一个汉字长度是1

myaql中服务器接受的编码:

mysql> show variables like 'character_%';#可以查看不同服务器之间的传输编码方式

windows默认的是GBK
修改编码方式: set 服务器name = gbk/utf8

校对集(collate)

在某种字符集下,字符和字符的关系称为校对集。比如(ASCII)a和B的大小关系,如果区分大小写a>B,如果不区分大小写a<B,不同的校对集的比较规则不一样。

create table t1(
	name char(1)
)charset=utf8 collate=utf8_general_ci;

create table t2(
	name char(1)
)charset=utf8 collate=utf8_bin;

insert into t1 values ('a'),('B');
insert into t2 values ('a'),('B');

牢记:
_bin:按二进制编码,对应ascall码区分大小写
_ci:不区分大小写

mysql> select * from t1 order by name;
+------+
| name |
+------+
| a    |
| B    |
+------+
2 rows in set (0.00 sec)	

mysql> select * from t2 order by name;
+------+
| name |
+------+
| B    |
| a    |
+------+
2 rows in set (0.00 sec)

显示所有的字符集: mysql> show character set;
显示所有校对集:mysql> show collation;

MYSQL数据类型

值类型:

(1)整型

整型占用字节范围
tinyint道德原则1-2 ^7 ~ 2^7-1 (-128~127)
smallint2-2 ^15 ~ 2^15-1 (-32768~32765)
mediumint3-2 ^23 ~ 2^23-1 (-8388608~8388607)
int4-231~231-1(-2147483648~2147483647)
bigint8-2 ^63 ~ 2^63-1 (太大了)

(2)unsigned(无符号)
  一个数是无符号数,那么它肯定是非负数。无符号数的范围相当于是有符号数的两倍。
  数据库mysql第一条记录一定是1(起码是),绝对不能是0

(3)显示宽度
  宽度:int(5):五个单位长度,不够用0补齐
  默认情况下显示位数不起作用,必须集合zerofill才起作用

(4)浮点型

浮点型占用字节范围
float4-3.4E+38 ~ 3.4E+38
double8-1.8E+308 ~ 1.8E+308

float理论上只保留小数点一位,根据实际版本
double理论上只保留小数点两位, 根据实际版本

(5)定位数:
Decimal(M,D), M的最大值是65,D的最大值是30,默认是(10,0)

create table test3(
	num1 float(10,2),  #插入的数字类型是10个字符,精度个位数
  	num2 decimal(10,2)  #插入的数字类型是10个字符,精度0.01
	);

insert into test3 values(123.57,1234567.00);

定点数和浮点数区别:
  不同点:
  定点数可以保留多个小数点位,它在有些情况下也会失去精度,但精度高于浮点数;浮点数的执行效率要高于定点数。
  相同点: 浮点数和定点数都支持 无符号.

字符类型

数据类型描述
char定长(255)
varchar可变长度(65535)
tinytext2^8-1 (255)
text2^16-1 (65535)
mediumtext2^24-1
longtext2^32-1

varchar(10) 和char(10)区别:
相同点:都是不能超过10个字符。
不同点
  char你输入5个字符,它还是占用了10个字符;
  varchar你输入5个字符,他会返还多于的空间(一般常使用,节省空间);
  char的最大长度是255;
  varchar的理论长度是65535;

枚举

列出一些单选的选项,例如:性别中的男/女

Create table test(
	Name varchar(10),
	Sex enum(‘男’,’女’,’保密’)
	);

Insert into test values(‘贾乃亮’,’男’)
Insert into test values(‘Pgame’,’人妖’)#报错,没有这个枚举选项

枚举型在数据库内部是通过整型来管理的,第一个是1,第二个是2,往后类推

Insert into test values(‘贾乃亮’,‘1’)
Insert into test values(‘马荣’,’2’)
Insert into test values(‘Pgone’,’3’)

优点:

  1. 限制值
  2. 节省空间
  3. 运行效率高

集合

列出数据类型,保存多选

Create table test02(
Name varchar(10) not null,
Hobby set(‘吃’,’喝’,’玩’,’乐’));

Insert into test02 values(‘小王’,’吃,喝,玩,乐’)
Insert into test02 values(‘小王’,’吃,喝,玩,你来’)#报错,因为集合中没有‘你来’该选项
Insert into test02 values(’小王‘,2^0);

和枚举一样为每个元素分配一个固定的值,分配的方式不一样:

  1. 管理方式也是整型
  2. 分配方式:2^0,2^1,2^2,……后面以此类推
    一个集合占用8个字节,所以集合最多只能保存64个选项。

日期时间型

数据类型描述
date日期,占用8个字节
time时间
datetime日期时间
year年份,占用一个字节
timestamp时间戳,占用4个字节

(1)datatime: 格式:年-月-日 时:分:秒

create table test4(
	create_at datetime
);

insert into test4 values('2018-01-12 15:00:53');
insert into test4 values(now());#表示的是当前的时间
insert into test4 values('10000-12-31 23:59:59') #错误,超出最大字符长度

(2) date: 仅表示时间的日期部分
(3) time:
  表示时间部分,也表示时间间隔,范围是-838:59:59~838:59:59(±35天)

create table test5(
create_at time
);

insert into test5 values('12:12:12');
insert into test5 values('212:12:12');
insert into test5 values('-800:12:12');
insert into test5 values('-839:59:59');  #错误的,超出范围

#time支持以天的方式表示时间间隔

insert into test5 values('10 12:59:59');

#最大可表示为:

insert into test05 values('34 22:59:59');

(4)timestamp
  从1970年1月1日00:00:00秒的格林威治时间开始计算,在python是特殊类型,但在MySQL中显示datatime格式

create table test6(
	create_at timestamp
);

insert into test6 values(now());
insert into test6 values('2018-01-12 15:43:30');
insert into test6 values('2038-01-19 11:14:07');#这里就是一个节点

insert into test6 values('2038-01-19 11:14:08');#超过了4个字节,报错

timestamp在格式上和datetime是一样的,它们的区别在于:
  datetime 从1到9999,而timestamp从1970年~2038年.
  timestamp占用4个字节,到2038年超过4个字节的长度了。
(4) year
占用一个字节,只能是255个数,以1900年为基数,范围是1900+1~1900+255。

create table test7(
	create_at year
);

insert into test7 values(1900);#错误的
insert into test7 values(1901);
insert into test7 values(2155);
insert into test7 values(2156);#错误的,不在范围内

布尔型

mysql不支持布尔型,所以用0和1代替。

create table test8(
	num boolean
);

insert into test8 values(True),(1),(False),(0);
insert into test8 values('A');#错误

布尔型的使用是比较少的,可以用tinyint代替,或者用enum代替。

列属性

1. 是否为空(null | not null)
  空字符串不等于null
2. 默认值default: 比如建立数据库密码默认为:123456
3. 自动增长列:
  auto_increment (自增)
字段值默认从1开始,每次递增1,特点:不会有重复的值,主键常

被删除的id不能被再次使用:
如果中间的某个ID值比较大,那么后面插入的id根据最大值依次+1

注:在mysql中自动增长的列必须作为主键.
自动增长的烈在插入的时候可以输入(null)
4. 主键:
primary key
主键:主键是唯一的
特点:不能为空,也不能重复,一个表只有一个主键
选择主键的原则:
1.最少性:必须选择单个键作为主键
2.稳定性:作为主键的这个字段最好不要被修改

唯一键(unique)

特点:不能为空,也不能重复,一个表可以有多个唯一键,例如:个人手机号,邮箱……

create table test13(
uid int auto_increment primary key,
mobile char(11) unique,
email char(32) unique,
pwd char(32)
);

insert into test13 values(null,'13877776666','this_dog@qq.com','123456');

insert into test13 values(null,'13877776665','this_do@qq.com','123456');

#修改表属性方法添加唯一键
alter table test13 add unique (mobile);

#删除唯一键还是使用删除的方法
alter table test13 drop index mobile;#有别名删除别名,没别名删除字段名

备注(comment)

备注(注释)用来给程序员相互交流使用的,只要那你能看的懂这个字段是干什么的。
stauts tinyint comment’描述一个人的状态 1表示死了,2表示活的,0表示半死不活’
SQL注释
Python注释:
单行注释:#
多行注释:’’’内容’’’
Mysql 注释:
单行注释:#、–
多行注释:/注释的内容/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值