MySQL字段类型


一、字符编码与配置文件

'''
MySQL的服务端字符编码默认使用的是latinl
所以我们在写入中文的时候会出现乱码情况
我们可以临时在把这个表的字符编码给改成utf8
但是这样的话态麻烦了这样每次都需要改
所以我们可以直接把配置文件给改了
'''

"""
但是官方说了他们自己的配置文件最好不要动
那么我们可以复制一份修改
my-default.ini    windows下MySQL默认的配置文件
拷贝上述文件并且重命名为my.ini
然后在该文件中编写上列代码:
[mysqld]
    character-set-server=utf8
    collation-server=utf8_general_ci
[client]
    default-character-set=utf8
[mysql]
    default-character-set=utf8  
这些都是在度娘上找的到的
注意如果配置文件涉及到了mysqld相关的配置修改 那么需要重启服务端才可以生效

因为MySQL每次登入的时候都会运行一遍配置文件
所以我们可以在配置文件中的[mysql]下把用户名和密码写上user='root'  password='密码'  
这样我们在登入的时候只需要写上 mysql 就可以登入了
"""

二、存储引擎

# 存储引擎我们可以简单的理解为针对相同的数据采用不同的存取方式

show engines;  # 查看所有的存储引擎

我们主要知道其中的四种

# 1.MySIAM
    MySQL5.5之前版本默认的存储引擎
    存储数据的速度快 但是功能较少 安全性不高

# 2.InnoDB
    MySQL5.6之后版本默认的存储引擎
    存储速度没有MySIAM快 但是有行锁、外键、支持事务等诸多功能
    安全性高

# 3.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;

InnoDB
    .frm      表结构
    .ibd      表数据、表索引(加快数据查询)
MyISAM
    .frm      表结构
    .MYD      表数据
    .MYI      表索引(加快数据查询)
Memory
    .frm      表结构
BlackHole
    .frm      表结构

我们看表中的数据
insert into t1 values(1);
# innodb是可以看到数据的
insert into t2 values(1);
# myisam也是可以看到数据的
insert into t3 values(1);
# memory只要mysql不重启数据或则电脑不关机数据就会还在
insert into t4 values(1);
# blackhole是没有数据 写进去也看不见

三、创建表的完整语法

'''
create table 表名(
     字段名1 字段类型(数字) 约束条件,
     字段名2 字段类型(数字) 约束条件,
     字段名3 字段类型(数字) 约束条件
)engine=存储引擎;
1.字段名和字段类型是一定要写的(至少一个)
2.数字和约束条件是可写可不写的
3.约束条件可以写多个 空格隔开即可
4.最后一个约束条件后面不能加逗号
5.存储引擎默认innodb
'''

四、字段类型之整型

MySQl的整型有多种

tinyint、smallint、int、bigint而每种的存储范围是不一样的,而且还有负数 负号还要占一个字节

 

 

# 1.验证整型是否自带负号
create table t6(id tinyint);
insert into t6 values(-129),(256);
当我们写进去的数字超出范围时
我们查看数据时发现会自动把数据自动填充为边界值(-128,255)
这样数据失真了 就没有了任何意义
上述所有整型都默认带有负号

# 2.自定义移除负号
'''unsigned 约束条件之一 意思是不要负号'''
    create table t7(id tinyint unsigned);
    insert into t7 values(-129),(256);
我们查看数据的时候 发现MySQl还是会帮我们填充至临界值(0,256)

'''
我们插入数据超出范围的时候 MySQL应该不要让我们插入 而不是修改值这样是没有意义的
数据库应该直接报错(这个特性MySQL是有的 只不过被我们修改了>>配置文件)
'''     
# 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);
    
    查看数据我们可以发现:
    t8:   1.111111164093017600000000000000
    t9:   1.111111111111111200000000000000
    t10:  1.111111111111111111111111111110
    float < double < decimal
"""
一般情况下float足够使用了
如果想追求非常完美的精确度 可以使用字符串来代替
""" 

六、字段类型之字符类型

# 表示字符类型有两种
# 1.char        定长
    char(4)
        表示最大只能存储四个字符 如果超出直接报错
        没有超出范围 用空格填充

# 2.varchar    变长
    varchar(4)
        表示最大只能存储四个字符 如果超出直接报错
        没有超出范围  就有几位存几位

# 验证两者的区别
        create table t11(id int, name char(4));
     create table t12(id int, name varchar(4));
# 1.结果发现我们在存入数据的时候两者类型只要超出四个字符就会报错
    主意  这个配置sql_mode='strict_trans_tables'没有写上的话是不会报错的
# 2.验证定长和变长特性
    char_length()  # 统计字段数据的长度
"""
默认情况下char在存储的时候针对没有满足固定位数的字符会自动填充空格
然后在读取的时候又会自动将填充的空格移除 如果想取消该机制 需要sql_mode
    set global sql_mode='strict_trans_tables,pad_char_to_full_length';
上述目录是替换 不是新增 所以之前的配置也要写上

这样在查看数据的时候我们就可以看到char和varchar的区别了
"""
# 3.char和varchar的区别
    char
        整存整取 速度快
          浪费存储空间
    varchar
        节省存储空间
       存取数据的速度慢于char
'''
char(4)
    a   son jacktom lili
    char在存没有超出字符范围的数据的时候是按照空格填充一起存储的
    取数据的时候也是按照4个字符4个字符取  所以会很快
varchar(4)
    1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili
    varchar在存没有超出范围的数据的时候是 在你存数据的前面加上一个报头然后计算你存的数据是多少位数一起存到报头中 取得时候就会先让报头然后计算存储的数据是多少位数然后拿到数据 所以费时间

但是使用的时候两者的使用频率都很高

就比如存储姓名>>>: varchar
'''
现在很多使用varcahr的

 

 

七、数字的含义

数字大部分情况下都是用来限制字段的存储长度 但是整型除外!!!
    不是用来限制存储的长度 而是展示的长度

create table t13(id int(3)); 
create table t14(id int(3) zerofill);    # zerofill 约束条件  不够按0填充
# 就是如果我存进去的数字是 12的话  那么展示的时候就会变成 012

总结
    以后涉及到整型字段的定义 类型后面不需要加括号写数字 除非有业务需求必须固定位数
    eg:
        00000000013
        00123123031   快递单号

八、字段类型之枚举与集合

# 1.枚举     多选一
    eg: 性别(男,女,其他)
create table t15(
    id int,
     name varchar(32),
    gender enum('male','female','others')
);

insert into t15 values(1,'jason','male');
'''
我们在填写数据的时候在写性别的时候就只能写着三种的一个
如果写其他的那么就会报错不写也会报错
'''

# 2.集合    多选多(包含多选一)
    eg: 爱好(唱、跳、rap) 
create table t16(
    id int,
    name varchar(32),
    hobbies set('read','run','music','rap')
);   
insert into t16 values(1, 'jason', 'read,music');
# 可以写一个也可以写多个 在引号中编写 用逗号隔开 不能不写、写错

九、日期类型

# 表示日期类型的有三种:
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');  
select * from t17;
+------+-------+------------+---------------------+------------+-----------+
| id   | name  | birth      | reg_time            | study_time | join_time |
+------+-------+------------+---------------------+------------+-----------+
|    1 | jason | 2022-11-11 | 2000-11-11 11:11:11 | 11:11:11   |      1995 |
+------+-------+------------+---------------------+------------+-----------+

十、约束条件

'''
写入数据有两种方式:
insert into 表名 values(数据,数据)          默认按照创建表的字段顺序添加
insert into 表名(字段名)  values(数据)     可以自定义字段顺序
'''
1.unsigned    无负号
    id int unsigned
2.zerofill    零填充
    id int zerofill
3.not null    非空
    name varchar(32) not null
    # 就是写入数据的时候不能为空 但是如果就写一个'' 也是能写入到表中的
4.default     默认值
    name varchar(32) default 'jason'
   # 就是在写入数据的时候如果我们不写的话那么数据默认就是 default后面的数据 写了就是写了的数据
5.unique    唯一值
    id int unique   单列唯一
    # 就是id这段数据只能不能重复 重复就写不进去了

    unique(host,port)  联合唯一
    # 联合唯一就是括号内 host可以一样 port也可以一样 但是两者和起来的时候不能一样
    eg:
        create table t5(id int,host varchar(32),port int, unique(host,port));
      insert into t5 values(1,'127.0.0.1',8080);
      insert into t5 values(2,'127.0.0.1',8081);
      insert into t5 values(3,'127.0.0.2',8081);
      # 上面三个都不会报错
      insert into t5 values(4,'127.0.0.1',8080);  # 如果一样就会直接报错

 

posted @ 2022-08-15 16:46  stephen_hao  阅读(91)  评论(0编辑  收藏  举报