字符编码与配置文件,存储引擎,创建表的完整语法,字段类型,字段约束条件

  • 字符编码与配置文件

  • 存储引擎

  • 创建表的完整语法

  • 字段类型 

    • 整型

      •  验证整型是否自带负号

      • 自定义移除负号

    • 浮点型

      • 使用方式

      • 验证精确度问题

    • 字符类型

      • 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);

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
    set global

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)
port int        
unique(host,port)  

联合唯一

 

posted @ 2022-08-15 17:56  没错,干就完了!  阅读(49)  评论(0)    收藏  举报