zoukankan      html  css  js  c++  java
  • 数据库引擎

    ---恢复内容开始---

    引擎: 数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎 存储引擎是针对表的 常见的存储引擎 innodb :mysql的默认引擎 ,支持事件,行级锁,功能最多 myisam: 查询速度很快 memory:存储于内存,重启服务器资料就没了 balckhole: 存啥没啥 ```python 验证:create database db1; use db1; 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; insert into t1 values(1); insert into t2 values(1); insert into t3 values(1); insert into t4 values(1); select * from t1; select * from t2; select * from t3;#有数据,重启服务端后,数据消失 select * from t4;#啥都没 ``` 创建表的完整语法 ```python create table 表名(字段名,类型[(宽度),约束条件])engine = innodb charset = utf8;

    create table dbl.t1(name char(3) not null);
    数据插入时,name不能为空(null),且最长只能存放三个字符

    此时name的默认值为null,当什么都不传会传""并不会报错,当传null时会报错

    数据库模式
    ```python
    分类:非安全模式(no_engine_substitution)
    安全模式(严格模式,strict_trans_tables)
    sql_mode反映数据库的全局变量,数据库模式限制的是客户端对服务器操作数据的方式,就是说客户端可以自己设定数据库模式,如果不设定,就使用默认的数据库模式 ,5.6版本sql默认的是非安全模式,5.7以上版本默认为安全模式
    1.查看数据模式
    show variables like "%mode%"#跟爬虫一样吧,查找带有mode的变量
    2.设置数据库模式
    set global sql_mode = "strict_trans_tables";
    3.重启客户端
    

    数据类型

    规定了数据库可以存放哪些数据
    分类:整形,浮点型,字符型,时间类型,枚举型和集合型
    数字类型两种:有符号,无符号
    整形:
    ①tinyint(1字节)
    ②smallint(2字节)
    ③mediumint(3字节)
    ④int(4字节)
    ⑤bigint(8字节)
    #不同类型所占字节数不一样,决定了所占空间及存放数据的大小限制
    通常使用tinyint和int
    1字节8个二进制位,第一位表示符号,故1个字节的有符号范围(-128-127)
    #非安全模式下,存入数值超范围,默认只存范围内的值
    #安全模式,超过范围会报错#ERROR 1264 (22003): Out of range value for column 'age' at row 1
    规定宽度
    1.不是决定整形存放数据的宽度,超过宽度可以存放,最终由数据类型所占字节决定
    2.如果没有超过限制宽度且有zerofill 限制,会用0填充前置位的不足位
    3.没有必要规定宽度,默认设置的宽度就是该整形能存放的最大宽度
    约束条件
    unsigned,zreofill
    unsigned 无符号数
    zerofill不足设定宽度的,会用0填充前置位的不足位
    

    浮点型

    (M,D)M为尾数,D为小数位
    float(255,30):4字节,精度低,最常用
    double(255,30):8字节,精度高,占位多
    decimal(65,30):字符串存,全精度
    
    create table t1 (x float(50,20),y double(50,20),z decimal(50,20));
    insert into t1 values(1.111111111111111111,1.111111111111111111,1.111111111111111111)
    #结果
    ------------------------+------------------------+------------------------+
    | x                      | y                      | z                      |
    +------------------------+------------------------+------------------------+
    | 1.11111116409301760000 | 1.11111111111111120000 | 1.11111111111111111100 |
    宽度相同,但是精度存在差别
    通常用float,精度够用了
    

    字符型

    分类:
    char:定长
    varchar:不定长
    宽度:
    限定存储宽度
    char(4):以4个字符存储,是字符数,不是字节,超出报错,存取高效,浪费空间,取时没4位取1次
    varchar(4):数据长度决定字符长度,但也不能超出长度,存取低效,节省空间,不知道数据的具体长度,会在数据头加上数据长的信息,占1bytes
    
    存放数据,验证长度:
    ①创建表,分别设字段 x char类型,y varchar类型
    create table t1(x char(4),y varchar(4));
    insert into t1("a","b");
    select * from t1;结果它两没有差别,因为mysql自动进行了优化
    ②更改模式
    sql_mode = "strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH";
    +---------------+---------------------------------------------+
    | Variable_name | Value                                       |
    +---------------+---------------------------------------------+
    | sql_mode      | STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH |
    +---------------+---------------------------------------------+
    重启客户端
    select * from t1:
    显示效果仍然一样
    select char_length(x),
    char_length(y)  from t1;
    mysql> select char_length(x),char_length(y) from t8;
    +----------------+----------------+
    | char_length(x) | char_length(y) |
    +----------------+----------------+
    |              4 |              1 |
    +----------------+----------------+
    1 row in set (0.00 sec)
    
    char 一定按规定宽度存放数据,以规定宽度读取数据,通常更占用空间
    varchar 需要数据头,1-2bytes
    首先根据数据长度,计算所需宽度,并在数据开始以数据头方式将宽度信息保存,是一个计算耗时过程,取先读取宽度信息,以宽度信息为标准,读取数据,通常节省空间
    总结:数据长度相近的数据提倡用char来存放数据,数据需要高速存取,以空间换时间,来用char
    
    

    时间类型

    类型:
    year:yyyy(1901/2155)
    date:yyyy-MM-dd(1000-01-01/9999-12-31)#需要以字符串方式传入
    time:HH:mm:ss
    datetime:yyyy-MM-dd HH:mm:ss(1000-01-01 00:00:00/9999-12-31 23:59:59)
    timestamp:yyyy-MM-dd  HH:mm:ss(1970-01-01 00:00:00/2037-01-01 00:00:00)
    
    宽度
    主动设置无效
    
    datetime vs timestamp
    datetime:时间范围,不依赖当时时区,8字节,可以为null
    timestamp:时间范围,依赖当时时区,4字节,有默认值CURRENT_TIMESTAMP)
    
    +-------+-----------+------+-----+-------------------+-----------------------------+
    | Field | Type      | Null | Key | Default           | Extra                       |
    +-------+-----------+------+-----+-------------------+-----------------------------+
    | y     | year(4)   | YES  |     | NULL              |                             |
    | d     | date      | YES  |     | NULL              |                             |
    | t     | time      | YES  |     | NULL              |                             |
    | dt    | datetime  | YES  |     | NULL              |                             |
    | ts    | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    +-------+-----------+------+-----+-------------------+-----------------------------+
    #除了year 都以字符串传入
    

    枚举类型和集合类型

    枚举类型enum : 多选1,
    1个不选?
    选2个?
    选不在范围?
    mysql> insert into t10 values("");
    ERROR 1265 (01000): Data truncated for column 'sex' at row 1
    mysql> insert into t10 values("haha");
    ERROR 1265 (01000): Data truncated for column 'sex' at row 1
    mysql> insert into t10 values("male,female");
    ERROR 1265 (01000): Data truncated for column 'sex' at row 1
    集合类型:多选多
    1个不选
    有默认值,不会报错
    选的不在范围内
    报错
    只选1个
    在范围内就不会报错
    
    
    约束条件:
    not null 不为空
    default 默认值
    unsigned 无符号
    zerofill 0填充
    auto_increment 自增,只能加给key字段辅助修饰
    primary key 主键,唯一标识
    foreign key 外键,其他表的主键
    unique key 唯一性数据
    
    单列唯一
    create  table t12(id int unique);
    联合主键:
    create table t13(host char(10) ,post int,primary key(host,port) )
    
    <p>---恢复内容结束---</p>
  • 相关阅读:
    ASP.NET3.5 企业级项目开发 -- 第一章(续):企业级项目框架解决方案的提出
    ASP.NET安全问题--Forms验证(后篇)--实战篇
    ASP.NET安全问题--Froms验证的具体介绍(中篇)
    ASP.NET3.5 企业级项目开发 -- 第二章(续) 数据访问层(DAL)的开发解决方案提出
    ASP.NET3.5 企业级项目开发
    ASP.NET3.5 企业级项目开发 -- 第二章 数据访问层(DAL)的开发
    通过js的学习谈谈学习方法
    转载:LINQ to SQL更新数据库操作
    通用分页存储过程真的有注入漏洞吗?
    [MOSS开发]:webpart在部署时应该注意的地方
  • 原文地址:https://www.cnblogs.com/robert-zhou/p/10241372.html
Copyright © 2011-2022 走看看