mysql char报错_8.19MySQL(二)

一、存储引擎

不同的数据应该有不同的处理机制

1.mysql存储引擎

Innodb:默认的存储引擎,查询速度较myisam慢,但是更安全

myisam:mysql老版本用的存储引擎

memory:内存引擎(数据全部存在内存中)

blackhole:无论存什么,都立马消失(黑洞)

2.查看所有的存储引擎

show engines;

3.研究一下每个存储引擎存取数据的特点

(1)Innodb:两个文件,一个是表结构文件,一个是真实数据文件

040fdcae2170c0e7c289f9d0ffbdaa52.png

(2)myisam:三个文件,表结构文件,真实数据文件,索引文件(目录)

6a05641904470f506f8471834f8f1699.png

(3)memory:一个文件,表结构文件

e5086eed29725a4b75087f87df7a40ca.png

(4)blackhole:一个文件,表结构文件

fc4f05daaccde7b61b18daca298a6172.png

二、创建表的完整性约束

1.创建表的完整语法

create table 表名(

字段名1 类型[(宽度) 约束条件],

字段名2 类型[(宽度) 约束条件],

字段名3 类型[(宽度) 约束条件]

);

注意:

(1)字段名和字段类型是必须的  中括号内的参数都是可选参数

(2)同一张表中字段名不能重复

(3)最后一个字段后面不能加逗号,例如:

create table t6(

id int,

name char,

);#错误

宽度:

(1)使用数据库的准则:能尽量让它少干活就尽量少干活

(2)对存储数据的限制:char(1),只能存一个字符

1.如果超了,mysql会自动帮你截取

2.会直接报错(mysql严格模式)

类型和中括号内的约束条件有什么区别:

类型约束的是数据的存储类型

而约束条件是基于类型之上的额外限制

2.约束条件:如何限制一个字段不能插空

alter table t5 modify name char not null;

not null 约束条件,该字段不能插空

三、严格模式

我们刚刚在上面设置了char,tinyint,存储数据时超过它们的最大存储长度,发现数据也能正常存储进去,只是mysql帮我们自动截取了最大长度。但在实际情况下,我们应该尽量减少数据库的操作,缓解数据库的压力,让它仅仅只管理数据即可,这样的情况下就需要设置安全模式

1.模糊匹配

like

%匹配任意多个字符

_匹配任意一个字符

show variables like "%mode%";  # 查看数据库配置中变量名包含mode的配置参数

2.修改严格模式

set session:临时有效,只在你当前操作的窗口有效

set global:全局有效,终生有效

set global sql_mode = ‘STRICT_TRANS_TABLES‘;

修改完之后退出当前客户端重新登陆即可

四、字段类型

c81a25869f79a36cb036f3ae185e4f2f.png

1.整型

SMALLINT、TINYINT、INT、BIGINT

TINYINT

create table t6(id TINYINT);

默认是带有符号的(-128,127)

超出之后只会存最大值或者最小值

怎样改成无符号

alter table t6 modify id TINYINT unsigned;

就改成无符号的(0,255)

INT

也是默认带有符号的

超出之后只会存最大值或者最小值

改成无符号与上方法一致

括号内的数字

char后面的数字是用来限制存储数据的长度的

特例:

只有整型后面的数字不是用来限制存储数据的长度,而是用来控制展示的数据的位数

int(8):够/超8位有几位存几位,不够8位空格填充

zerofill:修改约束条件,不够8位的情况下,用0填充

强调:

***对于整型来说,数据类型后的宽度并不是存储限制,而是显示限制,所以在创建表时,如果字段采用的是整型类型,完全无需指定显示宽度, 默认的显示宽度,足够显示完整当初存放的数据

只要是整型,都不需要指定宽度,因为有默认的宽度,足够显示对应的数据

约束条件:

not null       不能为空

unsigned    无正负符号

zerofill      0填充多余的位数

2.浮点型

float(255,30):总共255位,小数部分占30位

double(255,30):总共255位,小数部分占30位

decimal(65,30):总共65位,小数部分占30位

前一位表示所有的位数,后一位表示小数个数

精确度

验证

create table t12(id FLOAT(255,30));

create table t13(id DOUBLE(255,30));

create table t14(id DECIMAL(65,30));

insert into t12 values(1.111111111111111111111111111111);

insert into t13 values(1.111111111111111111111111111111);

insert into t14 values(1.111111111111111111111111111111);

精确度:float < double < decimal

3.字符类型

char(4):最大只能存四个字符,超出来会直接报错,如果少了,会自动用空格填充

varchar(4):最大只能存四个字符,超出来会直接报错,如果少了,有几个存几个

create table t15(name char(4));

create table t16(name varchar(4));

char_length():获取一个字符的长度

mysql在存储char类型字段的时候,硬盘上确确实实存的是固定长度的数据,但是在取出来的那一瞬间,mysql会自动将填充的空格去除

可以通过严格模式,来修改该机制,然后退出客户端重新登陆,这样mysql就不做自动去除末尾空格的操作,

set global sql_mode="strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";

char与varchar的使用区别

name char(5):char定长

优点:存取速度都快

缺点:浪费空间

name varchar(5):varchar变长

优点:节省空间

缺点:存取速度慢(较于char比较慢)

存的时候,需要给数据讲一个记录长度的报头

取的时候,需要先读取报头才能读取真实数据

4.日期类型

date:2019-05-01  年月日

datetime: 2019-01-02 11:11:11  年月日时分秒

time:11:11:11  时分秒

year:2019  年

测试:

create table student(

id int,

name char(16),

born_year year,

birth date,

study_time time,

reg_time datetime

);

insert into student values(1,‘egon‘,‘2019‘,‘2019-05-09‘,‘11:11:00‘,‘2019-11-11 11:11:11‘);

5.枚举与集合类型

分类

枚举enum:多选一

集合set:多选多

测试

create table user(

id int,

name char(16),

gender enum(‘male‘,‘female‘,‘others‘)

);

insert into user values(1,‘jason‘,‘xxx‘) #报错

insert into user values(2,‘egon‘,‘female‘) #正确!

create table teacher(

id int,

name char(16),

gender enum(‘male‘,‘female‘,‘others‘),

hobby set(‘read‘,‘sleep‘,‘sanna‘,‘dbj‘)

);

insert into teacher values(1,‘egon‘,‘male‘,‘read,sleep,dbj‘) #集合也可以只存一个

五、约束条件

1.not null:不能为空

2.default:给某个字段设置默认值(当用户写了的时候用用户的,当用户没有写就用默认值)

create table t17(id int,name char(16) default ‘jason‘);

往表中插入数据的时候,可以指定字段进行插入,不需要全部都插入

insert into t17(name,id) values(‘egon‘,2);

3.unique:唯一

单列唯一:限制某一个字段是唯一的

create table user1(

id int unique,

name char(16)

);

insert into user1 values(1,‘jason‘),(1,‘egon‘) #报错

insert into user1 values(1,‘jason‘),(2,‘egon‘) #成功

联合唯一:在语句的最后,用括号的形式,表示哪几个字段组合的结果是唯一的

create table server(

id int,

ip char(16),

port int,

unique(ip,port)

)

insert into server values(1,‘127.0.0.1‘,8080);

insert into server values(2,‘127.0.0.1‘,8080); #报错

insert into server values(1,‘127.0.0.1‘,8081);

4.primary key:主键

限制效果跟 not null + unique 组合效果一致,非空且唯一

create table t11(id int primary key);

desc t11;

insert into t11 values(1),(1); #报错

insert into t11 values(1),(2);

primary key也是innodb引擎查询必备的索引

innodb引擎在创建表的时候,必须要有一个主键

当你没有指定主键的时候

1.会将非空且唯一的字段自动升级成主键

2.当你的表中没有任何的约束条件,innodb会采用自己内部默认的一个主键字段

该主键字段你在查询时候是无法使用的

查询数据的速度就会很慢

类似于一页一页的翻书

create table t12(

id int,

name char(16),

age intnotnull unique,

addr char(16) notnull unique

);

主键字段到底该设置给谁

通常每张表里面都应该有一个id字段

并且应该将id设置为表的主键字段

联合主键

***多个字段联合起来作为表的一个主键,本质还是一个主键***

***PS:innodb引擎中一张表有且只有一个主键***

主键字段应该具备自动递增的特点:primary key auto_increment

主键id作为数据的编号,每次最好能自动递增

每次添加数据,不需要用户手动输入

auto_increment:自动递增

create table t13(

id int primary key auto_increment,

name char(16)

);

insert into t13(‘jason‘),(‘jason‘),(‘jason‘); #id字段自动从1开始递增#注意:auto_increment通常都是加在主键上,并且只能给设置为key的字段加

补充:

delete from t21;  仅仅是删除数据,不会重置主键

这条命令确实可以将表里的所有记录都删掉,但不会将id重置为0,所以收该条命令根本不是用来清空表的,delete是用来删除表中某一些符合条件的记录

truncate t21;  初始化表,会重置主键

将整张表重置,id重新从0开始记录

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值