文章目录
一.字符集
1.概念
字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等。
字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同。
2.常见字符集
ASCII: 基于罗马字母表的⼀套字符集, 它采用1个字节的低7位表示字符, 高位始终为0。
LATIN1: 相对于ASCII字符集做了扩展, 仍然使用⼀个字节表示字符, 但启用了高位,扩展了字符集的表示范围。
GB2312: 简体中文字符, ⼀个汉字最多占用2个字节
GB: 只是所有的中文字符, ⼀个汉字最多占用2个字节
UTF8: 国际通用编码, ⼀个汉字最多占用3个字节
UTF8MB4: 国际通用编码, 在utf8的基础上加强了对新文字识别, ⼀个汉字最多占用4个字节
gbk字符集最大字符串长度: 65535/2 -1 --> varchar(32766)
utf8字符集最大字符串长度: 65535/3 -1 --> varchar(21844)
utf8mb4字符集最大字符串长度: 65535/4 -1 --> varchar(16382)
3.使用场景
(1)保存数据的时候需要使用字符集
(2)数据传输的时候也需要使用字符集
(3)在存续的时候使用字符集
在MySQL的服务器上,在数据库中,在表的使用上,在字段的设置上。
在服务器安装的时候,可以指定默认的字符集。
4.查看当前mysql系统支持的字符集
show variables like 'character_%';
character_set_client:客户端来源数据使⽤的字符集
character_set_connection:连接层字符集
character_set_database:当前选中的数据库的默认字符集
character_set_filesystem:文件系统字符集
character_set_results:查询结果使用的字符集
character_set_server:默认的内部操作字符集
character_set_system:系统元数据(字段名、表名等)的字符集
5.修改当前的MySQL系统的字符集编码
(1)全部修改
set names gbk;
(2)指定修改
set character_set_client = utf8mb4;
set character_set_results = utf8mb4;
备注:它是临时性命令, mysql链接断开以后, 再次连接时会恢复原状
二.校对集
在某一种字符集下,为了使字符之间可以互相比较,让字符和字符形成一种关系的集合,称之为校对集。
⽐如说 ASCII 中的 a 和 B, 如果区分大小写 a > B,如果不区分 a < B;
不同字符集有不同的校对规则,命名约定:以其相关的字符集名开始,通常包括⼀个语言名,并且以 _ci、_cs 或 _bin 结束。
_ci : 大小写不敏感
_cs : 大小写敏感
_bin : binary collation 二元法,直接比较字符的编码,可以认为是区分大小写的,因为字符集中’A’和’a’的编码显然不同。
/* 数据库默认的排序⽅式,是升序 */
create table t1(
str char(1)
) charset=utf8mb4 collate=utf8mb4_general_ci; -- 后缀边是_ci的都是不区分⼤⼩写的
create table t2(
str char(1)
) charset=utf8mb4 collate=utf8mb4_bin; -- 后缀边是_bin的都是区分⼤⼩写的
Linux中MySQL是区分大小的,如果想要改变,需要自己去配置。
#找到my.cnf
vim /etc/mysql/my.cnf
#找到[mysqld]进行配置,其中1是不区分大小写,0是区分大小写
lower_case_table_names=1
# 查看字符集和校对集
show character set;
# 显示所有的校对集
show collation;
三.MySQL的数据类型
1.整型
⼀个无符号数⼀定是非负数:
create table t3(
age tinyint unsigned
);
显示宽度 (zerofill):
整型显示宽度, 位数不足时,用 0 填充
2.浮点型
定点数的位数更加长
使用方式:
float(M,D)
double(M,D)
decimal(M,D)
M 是支持多少个长度, D 是小数点后面的位数
当超过M时,会报错,同时float类型精度大约6位数字,超过会产生误差问题
3.字符串类型
CHAR 与 VARCHAR 类型的区别:
思考:字符串、浮点型等都可以随意指定大小, 那么是不是平时操作的时候随意指定⼀个就可以呢?
答:不是, 数据类型并不是越大越好, 越大的类型会造成数据臃肿, 存储空间占用过大, 数据检索也会变慢。
4.时间类型
其中timestamp 时间戳类型,在显示方面和datetime是⼀样的, 在存储上不⼀样
其范围从 1970-1-1 0:0:0 到 2038-1-19 11:14:07,使用 4 个字节表示
该值大小与存储的位长有关: 2 ** (4 * 8 - 1)
可以使用now()函数来获取现在时间
5.枚举(enum)
多选⼀的时候使用的⼀种数据类型
在前端使用单选框的时候, 枚举类型可以发挥作用
枚举类型的优点:
限制了可选值
节省空间
运行效率高
创建en表,给gender添加枚举数据类型:
插入数据:
当我们插入性别不是male、female以及unknown时,会报错:
枚举类型的计数默认从1开始的:
6.集合(set)
SET最多可以有64个不同的成员。类似于复选框, 有多少可以选多少。
7.布尔型
MySQL中的bool类型也是1和0.
create table `bool`(
cond boolean
);
insert into `bool` values(True),(False),(-1),(0.1); --成功
insert into `bool` set cond='True'; --失败
8.列的属性
(1)primary key
主键⼀般是唯⼀的标识
特性:不能为空,也不能重复,⼀张表当中只可以拥有⼀个主键
正常的主键:
create table `test`(
id int primary key,
name varchar(32)
);
有时,我们需要建立联合主键:
create table `test1`(
user_id int,
post_id int,
primary key(user_id,post_id)
);
有联合主键的表结构:
插入一些数据:
当再次插入相同组合数据时,会报错:
联合主键:就是指用2个或者是2个以上的字段组成的主键,用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且附加上了主键索引。
数据库主键:指的是一个列或多列的组合,其值能唯一地标识表中的每一行,通过它可强制表的实体完整性。
(2)auto_increment
自动增长的列,其默认从 1 开始,常配合主键使用
create table `test2`(
id int primary key auto_increment,
name varchar(32)
);
插入一些数据,查询表,会发现id自增。
(3)插入的值是否可以为空
null:是可以为空,默认不写
not null:不可以为空,如果插入的时候,某个字段的值为空,则报错
create table `test3`(
id int primary key auto_increment,
name varchar(32) not null,
pwd varchar(16) null
);
表结构:
(4)default
默认值⼀般是和null做搭配的
create table `test4`(
id int primary key auto_increment,
name varchar(32) default 'root' not null,
pwd varchar(16) default 123
);
表结构:
(5)unique
唯⼀键,保证列当中的每⼀个数据都不重复
例如:邮箱不可以重复,手机号不可以重复
create table `test5`(
id int primary key auto_increment,
tel char(11) unique
);
插入一些数据:
insert into test5 (tel) values (12345678911),(98765432111);
如果再插入相同的数据,则会报错。
(6)comment
字段说明: 给开发者看的, ⼀般用来对相应字段进行说明
create table `test6`(
id int primary key auto_increment comment '这字段代表创建id',
name varchar(32) comment '这个字段代表创建名字'
);
9.SQl注释
(1)单行注释: – hello world
(2)多行注释: /* hello world */
(3)MySQL 独有的单行注释: # hello world
四.MySQL的运算符
1.算术运算符
select 1 + 2, 4 - 2, 2 * 6, 10 % 3, -234 / 2, 2 / 0;
运行结果:
2.比较运算符
(1)常规比较:
select 1=2, 2<3, 3<=4, 4>5, 5>=3, 8!=9, 8<>9, 'abc' = 'Abc', 'z' > 'a';
运行结果:
(2)范围比较:
select 123 between 100 and 200, 'b' in ('a', 'b', 'c');
运行结果:
(3)null比较:
select 12 is null, 23 = null, null = null, null <=> null, null is null, 32 is not null;
运行结果:
(4)模糊比较(like):
select 'HelloWorld' like 'hello%';
运行结果:
3.逻辑运算符
xor:相当于异或