MYSQL 编码与配置,语法和字段

852 阅读6分钟

编码与配置

    1. 怎么样才能查看数据库的基本信息?
    • \s
      image.png
    1. 在配置文件中修改MYSQL的默认配置(5.6版本)
    • 将MYSQL文件下的my-default.ini进行拷贝重命名为my.ini,在里面修改就可 image.png
    • 添加字符编码配置直接百度或:配置文件涉及到mysqld相关配置时,需要重启客户端生效
      • 在配置文件中可以提前写好用户名和密码后直接登录mysql
    [mysqld]
        character-set-server=utf8
        collation-server=utf8_general_ci
    [client]
        default-character-set=utf8
    [mysql]
        default-character-set=utf8 
    

存储引擎

  • 查看所有存储引擎
    • show engines;
      image.png
  • 存储引擎的类型
    • MYISAM
    存取速度快,功能少,安全性低。mysql5.5之前默认
    
    • InnoDB
    存取速度较慢,安全性较高,支持事务,行锁,外键等功能。mysql5.5后默认
    
    • Memory
    基于内存的存储引擎,存取速度很快,断电立即丢失
    
    • BlackHole
    黑洞,写进去的数据会立刻丢失,类似于垃圾站
    
  • mysql对大小写不敏感(默认的)
  • 不同存储引擎之间底层文件是有区别的:(验证)
    • 1.创建InnoDB类型存储引擎的表
      • create table t1(id int) engine=innodb;
      底层文件:
      .frm     表结构
      .ibd     表数据,表索引(加快数据查询)
      
      • 存入数据
      insert into t1 values(1)
      
    • 2.创建MYISAM类型存储引擎的表
      • create table t2(id int) engine=MYISAM;
      底层文件:
      .frm     表结构
      .MYD     表数据
      .MYI     表索引(加快数据查询)
      
      • 存入数据
      insert into t1 values(1)
      
    • 3.创建Memory类型存储结构的表
      • create table t3(id int) engine=Memory;
      .frm     表结构
      
      • 存入数据
      insert into t1 values(1)
      
    • 4.创建BlackHole类型存储结构的表
      • create table t4(id int) engine=BlackHole;
      .frm     表结构
      
      • 存入数据
      insert into t1 values(1)
      

创建表的完整语法

create table 表名(
    字段名1 字段类型(数字) 约束条件,
    字段名2 字段类型(数字) 约束条件,
    字段名3 字段类型(数字) 约束条件
    )engine=存储引擎;
    1. 字段名和字段类型是必须的,至少需要一个
    1. 数字跟约束条件是可选的,可以都不出现
    1. 约束的条件可以写多个,空格隔开即可、
    1. 最后一个字段结尾不可以加逗号

字段的类型

  • 括号内数字的含义
    • 数字基本都是用来限制字段的存储长度(除了整型),不是限制长度,而是用来展示长度。
    create table t13(id int(3)); 
    create table t14(id int(3) zerofill);
    zerofill        如果值长度不够,在前面补0表示 
    
  • 总结
    • 涉及整型字段的含义,类型后面不需要加括号写数字,除非有业务需求,需要固定位数

字段类型之整型

tinyint      1bytes       没有负号:  0~255          有负号:  -128~127 
smallint     2bytes       没有负号:  0~65535        有负号:  -32768~32767
int          4bytes       没有负号:  0~4294967295   有负号:  -2147483648~2147483647
bigint       8bytes       没有负号:  0 ~ 2^64-1     有负号:  -2^63 ~ 2^63-1
  • 验证整型是否自带负号
      1. 新增表名
        image.png
      1. 往表内添加超出范围的数据 image.png
      1. 查看表内的数据
        image.png
  • 自定义移除负号(在字段类型后添加unsigned)
      1. 新增表名
        image.png
      1. 往表内添加超出范围的数据
        image.png
      1. 查看表内数据
        image.png
  • 总结:
    1. unsigned是约束条件之一,意思是不需要负号
    2. 插入的数据值超出了数据类型的范围,修该插入的数据值也是没有意义的
    3. 数据库的配置文件修改后可能会再插入的时候不提示报错。正常没修改的数据库插入超出范围会报错
    
    • 如何修改数据库内插入超出范围的报错提示:
      • 方式1: 命令临时修改
        第一种:
        set session sql_mode='strict_trans_tables'     # 当前客户端的操作界面有效
        
        image.png
        第二种:
        set global sql_mode='STRICT_TRANS_TABLES'      # 服务端不重启永久有效
        
        image.png
      • 方式2: 配置文件永久修改
        [mysqld]
             sql_mode='STRICT_TRANS_TABLES'
        

字段类型之浮点型

    # 第一个数表示总共多少位,第二个数表示小数占多少位
float     使用方式: float(255,30)  
double    使用方式: double(255,30)
decimal   使用方式: decimal(65,30)
  • 验证精准度
    • float精准度
      创建表:    create table t4(id float(255,30));
      存入数据:  insert into t4 values(1.1111111111111111111111111111111111);
      查看数据:  select * from t4;
      
      image.png
    • double精准度
      创建表:     create table t5(id double(255,30));
      存入数据:  insert into t5 values(1.1111111111111111111111111111111111);
      查看数据:  select * from t5;
      
      image.png
    • decimal精准度
      创建表:    create table t11(id decimal(65,30));
      存入数据:  insert into t11 values(1.1111111111111111111111111111111111);
      查看数据:  select * from t5;
      
      image.png
  • 数据的精准度
    float < double < decimal
    一般情况下float足够使用了
        如果想追求非常完美的精确度 可以使用字符串来代替
    

字段类型之字符类型(需要手动指定数字)

char      定长       char()括号里是几,就最大能存储几个字符,超出范围报错
                                      不超出范围,用空格填充到四个字符
varchar   变长       varchar()括号里是几,就最大能存储几个字符,超出范围报错
                                      不超出范围,能有几位就存几位              
  • 验证区别
    超出范围二者都会报错,使用char_length()可以统计数据的长度
        注意sql_mode='strict_trans_tables'
    
    • char
      image.png
    • varchar
      image.png image.png
    我们看到两者感觉上并没有什么区别,这是因为,默认情况下char存储的时候,没有满足长度会自动填充空格,读取时又会取消空格,所以看起来没什么区别
    <取消该机制需要使用sql_mode>  下面目录是替换,不是新增,之前的配置也要写
     set global 
         sql_mode='strict_trans_tables,pad_char_to_full_length';
    
  • char与varchar哪个更好呢
    • char整存整取,速度快,但是浪费存储空间
    • varchar节省存储空间,但是速度比char慢
          char(4):
              a   son jacktom lili      # 空格占位
          varchar(4):
              1bytes+a1bytes+son1bytes+jack1bytes+tom1bytes+lili
      存取数据都需要操作报头(耗时)
      
      • 二者使用都很频繁,很多时候默认为varchar

字段类型之枚举与集合

枚举enum

  • 多选一
例:性别(男,女,其他)          我们只能选择一次性别
create table t15(
    id int,
    name varchar(32),
    gender enum('male','female','others')  
);

image.png

  • 结果
    • 只能选择一个在里面的,不在选择里面的写入会报错
      image.png

集合set

  • 多选多(包含多选一)
例:爱好(唱,跳,rap,篮球)      我们可以选择多个爱好
create table t17(
    id int,
    name varchar(32),
    hobbies set('sing','jump','rap','basketball')
);

image.png

  • 结果
    • 可以选择里面的多个或一个,不在选择里面的写入会报错
      image.png

字段类型之日期类型

date         年月日
datetime     年月日时分秒
time         时分秒
year
  • 创建表:
        create table t18(
            id int,
            name varchar(32),
            birth date,              
            reg_time datetime,       
            study_time time,        
            join_time year       
            );
    添加数据:
        insert into t18 values(1,'tom','2011-11-11','2000-11-11 11:11:11','11:11:11','1995');
    查看数据:
        select * from t18;
    
  • 实操结果 image.png image.png

字段的约束条件

创建表:
    create table t19(id int,name varchar(32));
往表中添加数据:
    insert into t19(name,id) values('tom',1);    # 可以自定义字段顺序
    insert into t19 values(2,'ami');
查看表数据:
    select * from t19;
    1. unsigned(无负号)
create table t20(id int unsigned,name varchar(32));
    1. zerofill(零填充)
create table t20(id int zerofill,name varchar(32));
    1. not null(非空)
create table t20(id int,name varchar(32) not null);
    1. default(默认值)
create table t20(id int,name varchar(32) default 'jason');
    1. unique(唯一值)
    create table t20(id int unique,name varchar(32));
                  # 单列唯一  使用后所在的字段名数据不能重复
    
    • 操作
      image.png
    create table t20(id int,name varchar(32) default 'jason');
                  # 联合唯一  使用后组合后的数据不能重复
    
    • 操作
      image.png