字符集
一、字符集概念
字符集:charset是各种文字和符号在计算机中的总称
不同的字符集占用的存储空间不一样,存储的底层也不一样。但是不同字符集之间可以进行转换。
常见字符集:ASCII、Iatin1、GB2312、GBK、Unicode、UTF-8
二、mysql字符集:mysql内部对于数据实际存储的字符集(服务器端)
mysql内部队形存在字符集继承:字段->表->数据库->DBMS
数据存储的最终字符集由字段控制
客户端与服务器进行交互时,需要明确告知服务器客户端自己的字符集
示例:查看MySQL支持的所有字符集
show charset;
三、乱码问题解决
乱码原因1:数据在存储的时候已经变成乱码
客户端字符集与服务端解析字符集不一致
读取时想转成其他字符集均会错误
乱码原因2: 数据存储正确,但是读取时解析成错误的字符集
客户端能解析的字符集和服务器提供的字符集不一致
乱码解决方案:不论存储还是读取,都提前告知服务器当前客户端的字符集
set names 客户端字符集;
示例:cmd打开客户端,字符集是固定的GBK
set names gbk;
四、字符集设置原理:服务器端正确保证客户端的数据识别
mysql附区段提供了变量来记录客户端的字符集
mysql对应的存储字符集的变量可以修改
set names 字符集 就是对变量的修改,共有三个
character_set_client:客户端提供的数据的字符集
character_set_results:客户端需要服务端听过的数据的字符集
character_set_connection:连接使用的字符集,内部数据操作
示例
1、查看系统内部存储这些记录字符集的信息
show variables like 'character_set%';
%表示通配符,匹配后续所有不确定的数据
2、修改客户端字符集变量,保证数据正常存进服务端
set character_set_client=gbk;
3、修改客户端解析字符集变量,保证数据正常被客户端查看
set character_set_results=gbk;
4、使用set names字符集批量修改,保证客户端被服务端正确理解,同时客户端也能正确解析
set names gbk;
校对集
一、校对集概念:数据比较时对应的规则
校对集依赖字符集
校对集的校对方式分三种
大小写不敏感:_ci, case insensitive
大小写敏感:_cs, case sensitive
二进制比较:_bin
校对集是在进行数据比较时触发
二、校对集设置:在创建数据表的时候创建校对规则
校对规则可以在mysql四层对象设计
DBMS:系统配置
DB:数据库指定(库选项)
Table:表指定(表选项)
Field:字段指定(字段选项,一般不用)
校对集从Field到DBMS继承,优先级Field最高
校对集设置语法:collate 校对集规则;
示例
1、查看mysql支持的所有校对集
show collation;
2、在数据库层设计校对集
create database db_4 charset utf8mb4 collate utf8mb4_bin;
3、在数据表层设计校对集
create table t_4(
id int,
name varchar(18)
)charset utf8mb4 collate utf8mb4_bin;
4、在字段层设计校对集(一般不常用)
create table t_5(
id int,
name varchar(10) collate utf8mb4_bin
)charset utf8mb4;
三、校对集应用:触发校对规则的使用
校对集的应用通常是通过数据比较触发:order by
数据表中数据一旦产生,校对集的修改就无效
示例:触发校对:排序(升序) order by
select * from t_4 order by name;
字段类型
字段类型是mysql中用来规定实际存储的数据格式
mysql四大数据类型:整数类型、小数类型、字符串类型、时间日期类型
规定类型的字段只能插入相应的数据格式
一、整数类型
迷你整型:tinyint 1个字节
短整型:smallint 2个字节
中整型:mediumint 3个字节
标准整型:int 4个字节
大整型:bigint 8个字节
数值型存储在mysql中分为有符号和无符号,使用unsigned修饰
示例
设计一个表记录个人信息:年龄
create table t_7(
age tinyint unsigned,
)charset utf8;
显示宽度:int(L),整数在数据库中显示的符号(数字+符号)个数
显示宽度一般是类型能表示的最大值对应的数字个数(通过desc查看表字段显示)
显示宽度包含符号(如果允许为负,负号会增加一个宽度)
显示宽度可以主动控制:创建字段时加括号确定
显示宽度不会影响类型能表示的最大值
可以通过zerofill让不够宽度的数值补充到对应宽度
示例
1、有符号和无符号对应的宽度不一样
create table t_9(
a tinyint,
b tinyint unsigned
)charset utf8;
2、可以主动控制显示宽度
alter table t_9 add c tinyint(2) unsigned;
3、显示宽度不影响数据的大小
insert into t_9 values(1, 1, 1); 小于显示宽度
insert into t_9 values(100,100,100); 大于显示宽度
4、通过zerofill让小于显示宽度的数值前置补充0
alter table t_9 add d tinyint(2) zerofill; 0填充只针对正数
二、小数类型
(1)小数类型(浮点型)
单精度float、双精度double
浮点型有时会有精度损失
浮点数也区分有符号和无符号,无符号用unsigned修饰
(2)小数类型(定点型)
decimal(有效位数,小数位数),能保证精度的小数
整数部分=有效位数-小数位数
有效位数不超过65个
三、字符串类型
(1)字符串类型(定长型)
char(L),指定固定长度的存储空间存储字符串
定长的长度是字符而不是字节,L的最大值是255
字符串数据使用单引号或者双引号包裹
(2)字符串类型(变长型)
varchar(L),根据实际存储的数据变化存储空间
变长型的存储空间是由实际存储数据决定的
变长型的L也是指字符而不是字节
L指定的是最大长度,最大值是65535
变长需要额外产生1-2个字节,用来记录实际数据的长度。
实际存储空间:实际字符数*字符集对应字节数+记录长度
(3)字符串类型(文本字符串)
text/blob,专本用来存储较长的文本
文本字符串通常在超过255个字符时使用
text:普通字符
tinytext:迷你文本
text:普通文本
mediumtext:中型文本
longtext:长文本
blob:二进制字符(与text类似)
tinyblob
blob
mediumblob
longblob
定义字段时只需要指明text/blob,系统自动规定具体的类型
(4)字符串类型(枚举)
枚举:一种映射存储方式,以较小的空间存储较多的数据
枚举是在定义时确定可能出现的可能
枚举在定义后数据只能出现定义时其中的一种
枚举类似一种单选框
枚举使用1-2个字节存储,最多可以设计65535个选项
枚举实际存储使用数值,映射对应的元素数据从1开始
枚举语法:enum(元素1,元素2,…)
示例,记录人群类型:小朋友、少年、青年、中年、老年,每个人实际只属于一种类别
create table t_16(
type enum('小朋友','少年','青年','中年','老年')
)charset tuf8;
insert into t_16 values('少年');
insert into t_16 values('仙人');不存在的数据不能插入
(5)字符串类型(集合)
set,一种映射存储方式,以较小的空间存储较多的数据
集合是在定义是确定可能出现的元素进行穷举
集合在定义后数据只能出现定义时其中的元素
集合类似一种多选框
集合使用1-8个字节存储数据,最多可以设计64个元素
集合实际存储就是使用数值(二进制位),映射对应的元素数据,每个元素对应一个比特位
集合语法:set(元素1,元素2…)
示例
1、记录个人的球类爱好
create table t_17(
hobby set('足球', '篮球','羽毛球','网球','乒乓球')
)charset utf8;
insert into t_17 values('足球');
insert into t_17 values('篮球,网球,乒乓球');
2、可以通过字段+0的方式查看存储的具体数值
select hobby, hobby+0 from t_17;
四、时间日期类型
(1)时间日期类型(年)
year, mysql中用1个字节用来存储年份类型
示例
1、记录个人出生年份
create table t_18(
y1 year,
y2 year(4)
)charset utf8;
insert into t_18 values(1901,2155);
2、year类型允许使用2位数来插入,系统自动匹配对应年份
69以前,系统加2000;69以后,系统加1900
insert into t_18 values(69);
3、year类型特殊值为0000,可以使用00或0000插入
insert into t_18 values(00,0000);
(2)时间日期类型(事件戳)
timestamp,基于格林威治时间来记录
mysql中时间戳表现形式不是秒,而是年月日时分秒格式
使用4个字节存储
timestamp特点是所对应的记录不论哪个字段被更新,该字段都会更新到到当前时间
示例
1、记录商品库存的最后更新时间
create table t_19(
goods_name varchar(10),
goods_inventory int unsigned,
change_time timestamp
)charset utf8;
insert into t_19 values('nokia3110',100,'1971-01-01 00:00:00');
insert into t_19 values('nokia7110',10,'19710101000000');
2、timestamp会在自己所在的记录任何位置改变是自动更新时间
注意:在mysql8后,取消timestamp默认自动更新,如果需要使用,需要额外使用属性
alter table t_19 add c_time timestamp on update current_timestamp;
update t_19 set goods_inventory=80;
(3)时间日期类型(日期)
date,用来记录年月日信息
使用3个字节存储数据
存储日期格式为YYYY-MM-DD
存储范围是:1001-01-01~9999-12-31
示例
记录个人生日
create table t_20(
name varchar(10),
birth date
)charset utf8;
insert into t_20 values('Jim','2000-12-12');
insert into t_20 values('Tom','10011212');
(4)时间日期类型(日期时间)
datetime,综合存储日期和时间
使用8个字节存储数据
存储格式为:YYYY-MM-DD HH:II:SS
存储区间为:1000-01-01 00:00:00~9999-12-31 23:59:59
示例
记录个人具体的出生时间
create table t_21(
name varchar(10),
birth datetime
)charset utf8;
insert into t_21 values('Jim','2000-12-12 12:12:12');
insert into t_21 values('Tom','10011212182323');
(5)时间日期类型(时间)
time,记录时间或事件段
使用3个字节存储数据
数据插入格式分为两种
时间格式:[HH]:II:SS
时间段格式:D HH:HH:SS(D表示天)