字符编码与配置文件,存储引擎,创建表的完整语法,字段类型,字段约束条件
-
字符编码与配置文件
-
存储引擎
-
创建表的完整语法
-
字段类型
-
整型
-
验证整型是否自带负号
-
自定义移除负号
-
-
浮点型
-
使用方式
-
验证精确度问题
-
-
字符类型
-
char 和 varchar 的特点
-
验证 char 和varchar 的区别
-
验证定长和边长特性
-
char VS varchar
-
数字的含义
-
-
枚举与集合
-
日期类型
-
主要的四个日期类型
-
-
-
字段约束条件
-
主要的约束条件
-
字符编码与配置文件
在MySQL中,有时候我们在输入中文的时候会出现乱码的现象,这是因为编码的问题,下面我们一起来看如何解决这个问题:

我们输入 \s 先查看数据库的基本信息(用户、字符编码),可以发现有拉丁编码和gbk编码,由于5.6版本编码不统一 会造成乱码 我们需要统一修改>>>:utf8

my-default.ini # windows下MySQL默认的配置文件
在此之前我们要先创建一个.ini文件在里面添加下面的代码保存即可。
添加字符编码相关的配置(百度查看即可)
[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8

|
注意: 如果配置文件涉及到了mysqld相关的配置修改 那么需要重启服务端才可以生效 |
重启完服务端我们再次运行 \s 查看编码,发现编码已经被我们改成了utf8

|
ps: 偷懒操作 在配置文件中的mysql下提前写好用户名和密码 之后直接mysql登录(在my.ini中)
|
存储引擎
简单理解就是存储引擎针对相同的数据采用不同的存储策略
show engines;查看所有的存储引擎

主要的四个存储引擎
| MyISAM | MySQL5.5及之前版本默认的存储引擎 存取数据的速度快 但是功能较少 安全性较低 |
| InnoDB | MySQL5.5之后版本默认的存储引擎 存取数据的速度没有MyISAM快 但是支持事务、行锁、外键等诸多功能 |
| Memory | 基于内存的存储引擎 存取数据极快 但是断电立刻丢失 |
| BlackHole | 黑洞 任何写进去的数据都会立刻丢失 类似于垃圾站 |
ps:MySQL中默认是大小写不敏感的(忽略大小写)
我们来运行看看下面的代码:
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=memory;
create table t4(id int) engine=blackhole;
ps:windows cmd终端鼠标右键的意思就是粘贴
运行结束查看文件夹可以看到有这些文件:

| InnoDB .frm 表结构 .ibd 表数据、表索引(加快数据查询) MyISAM .frm 表结构 .MYD 表数据 .MYI 表索引(加快数据查询) Memory .frm 表结构 BlackHole .frm 表结构 |
同时t1,t2中的内容是可以永久保存的,而t3的内容是临时保存的,t4根本就不保存。
创建表的完整语法
create table 表名(
字段名1 字段类型(数字) 约束条件,
字段名2 字段类型(数字) 约束条件,
字段名3 字段类型(数字) 约束条件
)engine=存储引擎;
注意:
| 1.字段名和字段类型是必须的(至少写一个) 2.数字跟约束条件是可选的(可有可无) 3.约束条件可以写多个 空格隔开即可 4.最后一个字段的结尾千万不能加逗号 |
字段类型
整型

验证整型是否自带负号
create table t5(id tinyint);
insert into t5 values(-129),(256);
insert into t5 values(-129),(256);

ps:发现自动填写为两个边界值 数据失真 没有实际意义
上述所有的整型类型默认都会带有负号
自定义移除负号
'''unsigned 约束条件之一 意思是不需要负号'''
create table t6(id tinyint unsigned);
insert into t6 values(-129),(256);

修改配置文件起到报错的效果
但是:
插入的数据值超出了数据类型的范围 不应该让其插入并自动修改 没有意义,数据库应该直接报错(这个特性其实是有的 只是被我们改了>>>:配置文件)
方式1:命令临时修改
set session sql_mode='strict_trans_tables' 当前客户端操作界面有效
set global sql_mode='STRICT_TRANS_TABLES' 服务端不重启永久有效
方式2:配置文件永久修改
[mysqld]
sql_mode='STRICT_TRANS_TABLES'
方式二的修改图像:

重启服务端之后就会报错了

浮点型

我们主要认识有float double decimal 三种浮点型
三者都可以存储浮点型数据 但是各自的精确度不一致
使用方式
| float(255,30) # 第一个数表示总共多少位 第二个数表示小数占多少位 double(255,30) decimal(65,30) |
验证精确度问题
create table t8(id float(255,30));
create table t9(id double(255,30));
create table t10(id decimal(65,30));
insert into t8 values(1.11111111111111111111111111111);
insert into t9 values(1.11111111111111111111111111111);
insert into t10 values(1.11111111111111111111111111111);
根据结果可知:

他们的精确度是不一样的。由此我们可以给他们拍个序:
精确度排序: float < double < decimal
ps:
一般情况下float足够使用了
如果想追求非常完美的精确度 可以使用字符串来代替
字符类型
字符类型也指字符串类型

我们今天主要来研究 char 和 varchar
char 和 varchar 的特点
| char | 定长 | char(n) |
最大只能存储n个字符 如果超过范围则直接报错
|
| varchar | 变长 | varchar(n) |
最大只能存储n个字符 如果超过范围则直接报错
|
验证 char 和varchar 的区别
create table t12(id int, name char(4));
create table t13(id int, name varchar(4));

结果验证 超出范围两者都会报错
注意sql_mode='strict_trans_tables' 要写在配置文件中
验证定长和边长特性
char_length()统计字段数据的长度
|
默认情况下char在存储的时候针对没有满足固定位数的字符会自动填充空格 sql_mode='strict_trans_tables,pad_char_to_full_length'; |
char VS varchar
| char | 整存整取 速度快 浪费存储空间 |
| varchar | 节省存储空间 存取数据的速度慢于char |
| """ char(4) a son jacktom lili varchar(4) 1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili 存取数据都需要操作报头(耗时) 存储人的姓名>>>:varchar """ 两者使用频率都很高 现在默认很多时候是varchar |
数字的含义
数字大部分情况下都是用来限制字段的存储长度 但是整型除外!!!
不是用来限制存储的长度 而是展示的长度
| 总结 以后涉及到整型字段的定义 类型后面不需要加括号写数字 除非有业务需求必须固定位数 eg: 00000000013 00123123031 |
枚举与集合

枚举
| 多选一 eg:性别(男 女 其他) |
create table t15(
id int,
name varchar(32),
gender enum('male','female','others')
);
集合
| 多选多(包含多选一) eg:爱好(唱 跳 rap) |
create table t16(
id int,
name varchar(32),
hobbies set('read','run','music','rap')
);

日期类型

主要的四个日期类型
| date | 年月日 |
| datetime | 年月日时分秒 |
| time | 时分秒 |
| year | 年份 |
create table t17(
id int,
name varchar(32),
birth date,
reg_time datetime,
study_time time,
join_time year
);
insert into t17 values(1,'jason','2022-11-11','2000-11-11 11:11:11','11:11:11','1995');
但是目前没有学到模块,所以只能用手动的方式录入时间。
字段约束条件
| insert into 表名 vlaues() # 默认按照创建表的字段顺序添加 insert into 表名(字段) vlaues() # 可以自定义字段顺序 |
主要的约束条件
| unsigned | 无负号 | id int unsigned |
| zerofill | 零填充 | id int zerofill |
| not null | 非空 | name varchar(32) not null |
| default | 默认值 | name varchar(32) default 'jason' |
| unique | 唯一值 |
id int unique 单列唯一 host varchar(32) 联合唯一 |



浙公网安备 33010602011771号