MySQL_字符集及数据类型
1.字符集
字符集在什么时候可以发挥作用?
1.保存数据的时候需要使用字符集
2.数据传输的时候也需要使用字符集
- 在存续的时候使用字符集
- 在MySQL的服务器上,在数据库中,在表的使用上,在字段的设置上.
- 在服务器安装的时候,可以指定默认的字符集
grant all privileges on *.* to 'admin'@'%'identified by '123456' with grant option;
gb2312:简体中文字符,一个汉字最多占用2个字节
gbk:只是所有的中文字符,一个汉字最多占用2个字节
utf8:国际通用编码,一个汉字最多占用3个字节
utf8mb4:国际通用编码,在utf8的基础上加强了对新文字识别,一个汉字最多占用4个字节
#65535/2 -1
create table test(
text varchar(32766)
)charset=gbk;
#65535/3 -1
create table test1(
text varchar(21844)
)charset=utf8;
#65535/4 -1
create table test2(
text varchar(16382)
)charset=utf8mb4;
show variables like 'character_%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | gbk
| character_set_connection | gbk |
| character_set_database | utf8mb4
| character_set_filesystem | binary |
| character_set_results | gbk
| character_set_server | utf8mb4
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
set names gbk;
set character_set_client = gbk;
set character_set_results = gbk;
2.校对集
在某一种字符集下,让字符和字符形成一种关系的集合称之为校对集,
比如说ASCLL中的a和B,如果区分大小写a>B,如果不区分a<B;
#数据库默认的排序方式,是升序
create table t1(
str char(1)
)charset=utf8mb4 collate=utf8mb4_general_ci;
#在排序规则上看到带有_general_ci 尾缀的都是不区分大小写的
create table t2(
str char(1)
)charset=utf8mb4 collate=utf8mb4_bin;
#看到尾缀边是_bin的都是区分大小的
lower_case_table_names=1
show character set;
show collation;
3.MySQL的数据类型–值的类型
(1)整型
类别 | 占用字节 | 范围 |
---|
tinyint | 1 | -27-27-1 [-128~127] | smallint | 2 | -215-215-1 [-32768-32767] | mediumint | 3 | -223-223-1 | int | 4 | -231-231-1 [长度为10] | bigint | 8 | -263-263-1 |
(2)unsigned(无符号)
一个数是无符号的数,那么这个数一定是非负数
tinyint unsigned
create table t3(
age tinyint unsigned
);
(3)显示宽度(zerofill)
整型支持显示宽度
create table t4(
id int(10) zerofill primary key auto_increment,
name char(32)
);
(4)浮点型
类型 | 占用字节 | 范围 |
---|
float | 4 | -3.4E+38 ~3.4E+38 | double | 8 | -1.8E+308 ~1.8E+308 |
(5)定点数
float(M,D)
double(M,D)
decimal(M,D)
create table t5(
a float(10,2),
b double(10,2),
c decimal(10,2)
);
4.字符串类型
类型 | 描述 |
---|
char | 定长(255) | varchar | 可变长度(65535) | tinytext | 定长(255) | text | 定长(65535) | mediumtext | 2^24-1 | longtext | 2^32-1 |
5.枚举(enum)
多选一的时候使用的一种数据类型
在前端使用单选框的时候,枚举类型可以发挥作用
create table t6(
name varchar(32),
sex enum('男','女','保密') default 3
);
insert into t6 set name='王宝强',sex=1;
1.限制值
2.节省空间
3.运行效率高
6.集合(set)
在前端是复选框的时候,也不用
有多少可以选多少的一种数据类型
create table t7(
name varchar(32),
hobby set('吃','睡','玩','喝','抽')
);
insert into t7 values('孙婷挣','睡,抽,玩,吃,喝');
insert into t7 values('孙挺正','睡,抽');
第一个数:2^0
第二个数:2^1
第三个数:2^2
应为在现代网站开发中,多选框的值有上千个,值存储的空没有索引用的多
将复选框的值单独设计成一张表
7.时间类型
类型 | 描述 |
---|
date | 日期 | year | 年份 | time | 时间 | datetime | 日期和时间 | timestamp | 时间戳 |
1.datetime
create table `datetime`(
create_at datetime
);
insert into `datetime` values('2019-4-2 16:54:00');
insert into `datetime` values('2019/4/2 16:54:00');
insert into `datetime` values(now());
insert into `datetime` values('10000/4/2 16:54:00');
insert into `datetime` values('9999/4/2 16:54:00');
2.time
create table `time`(
create_at time
);
insert into `time` values('12:12:12');
insert into `time` values('100:12:12');
insert into `time` values('-100:12:12');
insert into `time` values('10 10:12:12');
insert into `time` values('839:12:12');
3.timestamp
create table `timestamp`(
create_at timestamp
);
insert into `timestamp` values(now());
insert into `timestamp` values('2038-1-19 11:14:07');
insert into `timestamp` values('2038-1-19 11:14:08');
4.year
create table `year`(
create_at year
);
insert into `year` values(now());
insert into `year` values('2155');
insert into `year` values('2156');
8.布尔型
mysql中的bool类型也是1和0
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='True';
9.列的属性
null:是可以为空,默认不写
not null:不可以为空,如果插入的时候,摸个字段的值为空,则报错
create table `null`(
id int primary key auto_increment,
username varchar(32) not null,
pwd varchar(16) null
);
insert into `null` values(null,null,null);
create table `default`(
id int primary key auto_increment,
username varchar(32) default 'admin' not null,
pwd varchar(16) default 123456
);
insert into `default`(username) values('admin');
默认从1开始
配合主键使用的
create table `auto`(
id int primary key,
username int auto_increment
);
create table `primary`(
id int,
sid int,
primary key(id,sid)
);
create table `unique`(
uid int auto_increment primary key,
mobile char(11) unique
);
insert into `unique` set mobile=13999999999;
status tinyint comment '0代表普通用户,1代表普通会员,2高级会员'
10.SQL注释
单行:
多行:'''
'''
单行注释:
单行注释:--
多行:/*文字*/
create table userinfo(
uid int primary key auto_increment,
uname char(32),
pwd char(16)
);
insert into userinfo(uname,pwd) values('admin',123),('admin1',1234),('admin2',12345),('admin3',123456);
##sql注入
select * from userinfo where uname='admin' and pwd ='123';
select * from userinfo where uname='' or 1=1 --'' and pwd ='123';
select * from userinfo where uname='' or 1=1 #'' and pwd ='123';
select * from userinfo where True;
#数据库穿透
#前端正则,后端正则
select * from userinfo;
|