1、字符集
有时候,数据库需要用到不同的字符集来处理数据,这就要用到字符集设置
set names 字符集;
如 set names gbk;
深层原理:客户端,服务端,连接层
客户端传入数据给服务端:client:character_set_client
服务端返回数据给客户端:server:character_set_results
客户端与服务端之间的连接:connection:character_set_connection
查看几个层次之间的字符集
show variables like ‘character_set_%’;
或者修改单个层次的字符集:set 变量名 = 值;
如set character_set_client = gbk;
重新插入数据可以,但是查看的话就会出错,因为3个层级之间的字符集不一样
Set names gbk; //等价于
Set character_set_client = gbk; //为了让服务器识别客户端传来的数据
Set character_set_connection = gbk;//更好的帮助客户端与服务端之间进行字符集转换
Set character_set_results = gbk;//为了告诉客户端服务端所有的返回的数据字符集
2、列类型(字段类型)
2.1、整数类型
- tinyint 迷你整型,1个字节=8位,-128~127
- small 小整型,2个字节,-32768~32767
- mediumint 中整型 ,3个字节,-83388608~83388607
- int 标准整型,4个字节,
- bigint 大整型,8个字节
2.2、无符号标识设定
无符号:没有符号,没有负数,只有整数,如tinyint范围变成了0-255
使用方法:在类型之后加上一个unsigned
create table my_int(
int_1 tinyint unsigned ) ; --用了无符号标识
insert into my_int values(100);--正确
insert into my_int values(-25);--错误
2.3、显示长度(失败,自己操作和书本的不一样)
显示长度:指数据(整型)在数据显示的时候,到底可以显示多长位。
例如:
tinyint(3): 表示最长可以显示3位,unsigned说明只能是正数,0-255永远不会超过三个长度,例如001
tinyint(4):表示最长可以显示4位,-128~127,例如-026
使用了zerofill后默认使用unsigned
alter table my_int add int_2 tinyint zerofill ;
--增加一列
3、小数型
3.1、浮点型
浮点型又称之为精度类型:是一种有可能丢失精度的数据类型,数据有可能不那么准确(由其是在超出范围的时候)
- float : 单精确型,4个字节来提供,大概是10^38,只能保证7个精度,大于7个数据会丢失
- double:双精度型,8个字节,10^308,但是准确度也只有15位
使用方法(float来举例):
float表示不指定小数点的浮点数
float(M,D):表示一共存储M个有效数字,其中小数点占D位
--创建一个float和一个float(10,2)类型的表
create table my_float (
f1 float,
f2 float(10,2));
--插入3位小数点
insert into my_float values(123.123,456.789);
-- 第二个插入10个有效数字
insert into my_float values(123.123,12345678.90);
--该数据插入失败,第二个超过了范围
insert into my_float values(123.123,123456789.99);
--
insert into my_float values(123.123,12345678.99);
--插入满的10位有效数字
insert into my_float values(123.123,99999999.99);
注意:如果数据精度丢失,那么浮点型是按照四舍五入的方式进行计算
浮点数的应用:通常是用来保存一些数量特别大,大到可以不用那么精确的数据。
3.2、定点数
decimal :系统会自动根据存储的数据来分配空间,每9个数分配4个字节。
用法:
decimal(M,D) :M表示有效数字,最大值不能超过65,D代表小数部分,最大值不能超过30
--创建定点数类型数据
create table my_decimal (
f1 float(10,2),
d1 decimal(10,2)
);
--插入同样的数据,但保存的东西不一样
insert into my_decimal values(99999999.99,99999999.99);
4、时间日期类型
- date
日期类型:系统使用三个字节来存储数据,对应的格式为:YYYY-mm-dd,能表示的范围是从1000-01-01 到9999-12-12,初始值为0000-00-00 - time
时间类型:能够表示某个指定的时间,但是系统同样是提供3个字节来存储,对应的格式为:HH:ii:ss,但是mysql中的time类型能够表示时间范围要大的多,能表示从-838:59:59~838:59:59,在mysql中具体的用处是用来描述时间段。 - datetime
日期时间类型:就是将前面的date和time合并起来,表示的时间,使用8个字节存储数据,格式为YYYY-mm-dd HH:ii:ss,能表示的区间1000-01-01 00:00:00 到9999-12-12 23:59:59,其可以为0值:0000-00-00 00:00:00 - timestamp
时间戳类型:mysql中的时间戳只是表示从格林威治时间开始,但是其格式依然是:YYYY-mm-dd HH:ii:ss - year
年类型:占用一个字节来保存,能表示1900~2155年,但是year有两种数据插入方式:0 ~ 99和四位数的具体年
--创建时间数据表
create table my_date (
Ddate date,
Dtime time,
Ddatetime datetime,
Dtimestamp timestamp,
Dyear year
);
--插入数据
insert into my_date values(
'2020-04-16',
'12:12:12',
'2020-04-16 00:00:00',
'2020-04-16 00:00:00',
2077
);
-
time的特殊性:
其可以存储一个很大的数,超过24
在进行时间类型录入的时候(time)还可以使用一个简单的日期代替时间,在时间格式之前加一个空格,然后指定一个数字(可以是负数):系统会自动将该数字转换成天数 * 24小时,再加上后面的时间。
例如上面的’12:12:12’,改成’5 12:12:12’,结果就会为:132:12:12,因为5 * 24+12=132 -
PHP中有着非常强大的时间日期转换函数:date将时间戳转换成想要的格式,strtotime又可以将很多格式转换成对应的时间戳。PHP通常不需要数据库来帮助处理这么复杂的时间日期,所以通常配合PHP的时候,时间的保存通常使用时间戳(真正),从而用整型来保存。字符串型
5、字符串类型
5.1、char
char(L),L为字符数,0<L<=255
5.2、varchar
varchar(L),L为字符数,0<L<=65535
其中,varchar会根据字符串的长度去自动分配合适的长度,每个varchar后面都会产生1-2个字节开销,用来保存长度。
5.3、text
- Tinytext:系统使用一个字节来保存,实际能够存储的数据为:2 ^ 8 + 1
- Text:使用两个字节保存,实际存储为:2 ^ 16 + 2
- Mediumtext:使用三个字节保存,实际存储为:2 ^ 24 + 3
- Longtext:使用四个字节保存,实际存储为:2 ^ 32 + 4
ps:如果没有选择哪个text类型的话,选择text,系统会根据长度自动去选择哪个text类型的
5.4、enum 枚举
枚举类型,先预设几个类型,该数据的类型只能从这几种预设类型中选择一个,相当于单选框
- 使用方法:enum(‘数据值1’,‘数据值2’,……)
create table my_enum (sex enum('man','woman'));
insert into my_enum values('man');
insert into my_enum values('woman');
--插入错误的类型
insert into my_enum values('other');--这行会报错
枚举enum的存储原理!!!
- 实际上字段上所存储的值并不是真正的字符串,而是字符串对应的下标:当系统设定枚举类型的时候,会给枚举中每个元素定义一个下标,这个下标规则从1开始
enum(1=>‘man’,2=>’woman’);
insert into my_enum values (2);
- 也可以这样查看
select sex + 0 from my_enum;
5.5、set
是一个将多种数据选项同时保存的类型,选中的为1,没选中的为0,和enum一样都是存储数字而不是存储字符串,但是存储的时候会把二进制颠倒过来存储
set(‘数据值1’,‘数据值2’,‘数据值3’,……)
create table my_set(
hobby set('唱','跳','rap','篮球')
)charset utf8;
insert into my_set values('唱');
-- 1000
insert into my_set values('唱,跳,rap');
-- 1110
--虽然是这样,但是存储的时候会把二进制颠倒过来
insert into my_set values(hobby+0);
insert into my_set values(15);