字符集(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) |
smallint | 2 | -2 ^15 ~ 2^15-1 (-32768~32765) |
mediumint | 3 | -2 ^23 ~ 2^23-1 (-8388608~8388607) |
int | 4 | -231~231-1(-2147483648~2147483647) |
bigint | 8 | -2 ^63 ~ 2^63-1 (太大了) |
(2)unsigned(无符号)
一个数是无符号数,那么它肯定是非负数。无符号数的范围相当于是有符号数的两倍。
数据库mysql第一条记录一定是1(起码是),绝对不能是0
(3)显示宽度
宽度:int(5):五个单位长度,不够用0补齐
默认情况下显示位数不起作用,必须集合zerofill才起作用
(4)浮点型
浮点型 | 占用字节 | 范围 |
---|---|---|
float | 4 | -3.4E+38 ~ 3.4E+38 |
double | 8 | -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) |
tinytext | 2^8-1 (255) |
text | 2^16-1 (65535) |
mediumtext | 2^24-1 |
longtext | 2^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’)
优点:
- 限制值
- 节省空间
- 运行效率高
集合
列出数据类型,保存多选
Create table test02(
Name varchar(10) not null,
Hobby set(‘吃’,’喝’,’玩’,’乐’));
Insert into test02 values(‘小王’,’吃,喝,玩,乐’)
Insert into test02 values(‘小王’,’吃,喝,玩,你来’)#报错,因为集合中没有‘你来’该选项
Insert into test02 values(’小王‘,2^0);
和枚举一样为每个元素分配一个固定的值,分配的方式不一样:
- 管理方式也是整型
- 分配方式: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 注释:
单行注释:#、–
多行注释:/注释的内容/