zoukankan      html  css  js  c++  java
  • Mysql 数据库(三)

    一、数值类型

      1、整数类型:应用场景,存放年龄,等级,id或者各种号码等等

      TINYINT:1个字节存放,有符号范围:-128到127,没有符号范围:0,255 。

      SMALLINT:2个字节存放,有符号范围:-32768到32767,没有符号范围:0到65535 。

      MEDIUMINT:3个字节存放,有符号范围:-8388608到8388607,没有符号的范围:0到16777215 。

      INT:4个字节存放,有符号范围:-2147483648到2147483647,没有符号的范围:0到4294967295 。

      BIGINT:5个字节存放,有符号范围:-9233372036854775808到9233372036854775807,没有符号范围:0到18446744073709551615 。

        整型的宽度指的是显示宽度,并不是存储宽度。限制的显示宽度默认是11位。

    mysql> create table t4(id int);
    Query OK, 0 rows affected (0.46 sec)
     
    mysql> desc t4;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.02 sec)
     
    mysql> insert into t4 values(1111111111111111111111111111111111111111111);
    Query OK, 1 row affected, 2 warnings (0.17 sec)
     
    mysql> select * from t4;
    +------------+
    | id         |
    +------------+
    | 2147483647 |
    +------------+
    1 row in set (0.00 sec)

      注意:如果在5.7中超过了该范围就会报错  

           什么是显示宽度:查看的时候显示的结果。

    mysql> desc t3;
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | id    | int(3) | YES  |     | NULL    |       |
    +-------+--------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    mysql> insert into t3(id)values(555555555);
    Query OK, 1 row affected (0.04 sec)
     
    mysql> select * from t3;
    +-----------+
    | id        |
    +-----------+
    | 555555555 |
    +-----------+
    1 row in set (0.00 sec)

     如果存放的值超过了最大的范围,就会显示该整型的最大值,默认的都是有符号的。

     unsiged:按照无符号的范围,将默认值变成无符号。

    mysql> create table t4(id int);
    Query OK, 0 rows affected (0.46 sec)
     
    mysql> desc t4;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id    | int(11) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.02 sec)
     
    mysql> insert into t4 values(1111111111111111111111111111111111111111111);
    Query OK, 1 row affected, 2 warnings (0.17 sec)
     
    mysql> select * from t4;
    +------------+
    | id         |
    +------------+
    | 2147483647 |
    +------------+
    1 row in set (0.00 sec)
     
     
     
     
    mysql> create table t5(id int unsigned);
    Query OK, 0 rows affected (0.45 sec)
     
    mysql> desc t5;
    +-------+------------------+------+-----+---------+-------+
    | Field | Type             | Null | Key | Default | Extra |
    +-------+------------------+------+-----+---------+-------+
    | id    | int(10) unsigned | YES  |     | NULL    |       |
    +-------+------------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
     
    mysql> insert into  t5 values(11111111111111111111111111111111111111111);
    Query OK, 1 row affected, 2 warnings (0.05 sec)
     
    mysql> select * from t5;
    +------------+
    | id         |
    +------------+
    | 4294967295 |
    +------------+
    1 row in set (0.00 sec)

        zerofill:长度不够定义的长度,就用0补全

    mysql> create table t2(id int zerofill);
    Query OK, 0 rows affected (0.23 sec)
     
    mysql> insert into t2(id)values(333);
    Query OK, 1 row affected (0.05 sec)
     
    mysql> select * from t2;
    +------------+
    | id         |
    +------------+
    | 0000000333 |
    +------------+
    1 row in set (0.00 sec)

     2 浮点类型:应用场景,身高,价钱,水电费等等。

      FLOAT:单精度,精确度最低,定义该类型时需要传入两个参数,第一个参数是数字的总个数;第二个参数传入的是小数点后面的数字的个数。第一个参数的最大值是255,第二个参数的最大值是30.。随着小数的增多,精确度会越来越不准确。

    mysql> create table t5(x float(255,30));
    Query OK, 0 rows affected (0.38 sec)
     
    mysql> insert into t5 values(1.1111111111111111111111111111111111111);
    Query OK, 1 row affected (0.04 sec)
     
    mysql> select * from t5;
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111164093017600000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)

    DOUBLE:双精度,浮点数值,定义该类型时还是需要传入两个参数,第一个参数时数字的总个数,第二个参数传入的是小数点后面数字的个数。第一个参数最大值也是255,第二个参数的最大值还是30,随着小数的增多,精确度会越来越低,但是比float类型要高一些。

    mysql> create table t6(x double(255,30));
    Query OK, 0 rows affected (0.22 sec)
     
    mysql> desc t6;
    +-------+----------------+------+-----+---------+-------+
    | Field | Type           | Null | Key | Default | Extra |
    +-------+----------------+------+-----+---------+-------+
    | x     | double(255,30) | YES  |     | NULL    |       |
    +-------+----------------+------+-----+---------+-------+
    1 row in set (0.03 sec)
     
    mysql> insert into t6 values(1.111111111111111111111111111111111111111);
    Query OK, 1 row affected (0.04 sec)
     
    mysql> select * from t6;
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111200000000000000 |
    +----------------------------------+
    1 row in set (0.00 sec)

    DECIMAL:小数值,精确度最高,在定义该类型的时候还是需要传入两个参数,第一个参数传入的还是数字的总个数,第二个参数还是传入小数点后面数字的个数,第一个参数最大值是65,第二个参数最大值还是30。随着小数的增多,小数的精确度始终准确。对于精确值计算时需要用此类型。DECLMAL精确度一直准确的原因是因为在其内是用字符串类型存储的。

    mysql> create table t7(x decimal(65,30));
    Query OK, 0 rows affected (0.27 sec)
     
    mysql> insert into t7 values(1.11111111111111111111111111111111111111111111111111111111111111);
    Query OK, 1 row affected, 1 warning (0.04 sec)
     
    mysql> select * from t7;
    +----------------------------------+
    | x                                |
    +----------------------------------+
    | 1.111111111111111111111111111111 |
    +----------------------------------+
    1 row in set (0.00 sec)

    3 bit类型:2进制显示;hex类型:8进制显示。

    #了解:BIT
    mysql> create table t9(x bit(1));
    Query OK, 0 rows affected (0.34 sec)
     
    mysql> insert into t9 values(2);
    Query OK, 1 row affected, 1 warning (0.04 sec)
     
    mysql> select * from t9;
    +------+
    | x    |
    +------+
    |     |
    +------+
    1 row in set (0.00 sec)
     
    mysql> select bin(x) from t9;
    +--------+
    | bin(x) |
    +--------+
    | 1      |
    +--------+
    1 row in set (0.02 sec)
     
    mysql> select hex(x) from t9;
    +--------+
    | hex(x) |
    +--------+
    | 1      |
    +--------+
    1 row in set (0.00 sec)

    除了整数类型以外,其他数据类型表示的都是存储上面的限制。

    二 日期类型

     date:‘年-月-日’  表示年月日 ,该范围是(1001-01-01到9999-12-31)

     time:‘时:分:秒’  表示的是时分秒,该范围是(-838:59:59到838:59:59)

     datetime:‘年-月-日   时:分:秒’   前面两者的结合,该范围是(1001-01-01  00:00:00到9999-12-31   23:59:59)

     timestamp:‘年-月-日  时:分:秒’   和上面的限制功能是一样的,就是范围比上面的要小,该范围是(1970-01-01  00:00:00到2037 年的某一日)

     year:表示的是哪一年。该范围是(1901到2055)

    mysql> create table t8(t time,
        ->                d date,
        ->                d_t datetime,
        ->                t_s timestamp,
        ->                y year);
    Query OK, 0 rows affected (0.27 sec)
     
    mysql> insert into t8 values('22:03:30','2017-10-23','1995-04-10  08:29:47','2008-08-08  20:08:08','1906');
    Query OK, 1 row affected (0.03 sec)
     
    mysql> select * from t8;
    +----------+------------+---------------------+---------------------+------+
    | t        | d          | d_t                 | t_s                 | y    |
    +----------+------------+---------------------+---------------------+------+
    | 22:03:30 | 2017-10-23 | 1995-04-10 08:29:47 | 2008-08-08 20:08:08 | 1906 |
    +----------+------------+---------------------+---------------------+------+
    1 row in set (0.00 sec)

    应用场景:注册时间,文章发布会,生日等等。

    datetime和timestamp的却别:1 datetime传入空时,默认为空;而timestamp传入的空时,默认为当前的时间戳。2 datetime的显示与时区有关;timestamp的显示与时区无关。

    create table t11(
        x datetime,
        y timestamp
    );
     
    desc t11;
     
    mysql> desc t11;
    +-------+-----------+------+-----+-------------------+-----------------------------+
    | Field | Type      | Null | Key | Default           | Extra                       |
    +-------+-----------+------+-----+-------------------+-----------------------------+
    | x     | datetime  | YES  |     | NULL              |                             |
    | y     | timestamp | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
    +-------+-----------+------+-----+-------------------+-----------------------------+
    2 rows in set (0.01 sec)
     
    mysql> insert into t11 values(null,null);
    Query OK, 1 row affected (0.04 sec)
     
    mysql> select * from t11;
    +------+---------------------+
    | x    | y                   |
    +------+---------------------+
    | NULL | 2017-10-23 10:25:07 |
    +------+---------------------+
    1 row in set (0.00 sec)
     
     
     
    mysql> insert into t11 values('1011-11-11','1011-11-11');
    Query OK, 1 row affected, 1 warning (0.05 sec)
     
    mysql> select * from t11;
    +---------------------+---------------------+
    | x                   | y                   |
    +---------------------+---------------------+
    | NULL                | 2017-10-23 10:25:07 |
    | 1011-11-11 00:00:00 | 0000-00-00 00:00:00 |
    +---------------------+---------------------+

    三 字符串类型

     1 char类型:定长,简单粗暴,但是浪费空间,存取的速度快。0到255字节之间。

      如果超过了定义的长度,就只保留定义长度的范围,如果没有达到定义的长度,就会利用空格补全。

    mysql> create table t10(x char(255));
    Query OK, 0 rows affected (0.22 sec)
     
    mysql> desc t10;
    +-------+-----------+------+-----+---------+-------+
    | Field | Type      | Null | Key | Default | Extra |
    +-------+-----------+------+-----+---------+-------+
    | x     | char(255) | YES  |     | NULL    |       |
    +-------+-----------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    mysql> create table t11(x char);
    Query OK, 0 rows affected (0.86 sec)
     
    mysql> desc t11;
    +-------+---------+------+-----+---------+-------+
    | Field | Type    | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | x     | char(1) | YES  |     | NULL    |       |
    +-------+---------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    # 默认长度为1

     2 varchar类型:变长,精准,节省空间,存取速度慢,0到65535字节之间(注意:在5.7版本中)。

      不管定义的宽度,如果超出范围,就会按照定义的长度存储,如果没有超出范围,就会按照传入的长度存储。

    mysql> create table t12(x varchar(21844));
    Query OK, 0 rows affected (0.28 sec)
     
    mysql> desc t12;
    +-------+----------------+------+-----+---------+-------+
    | Field | Type           | Null | Key | Default | Extra |
    +-------+----------------+------+-----+---------+-------+
    | x     | varchar(21844) | YES  |     | NULL    |       |
    +-------+----------------+------+-----+---------+-------+
    1 row in set (0.02 sec)

      如果存储长度的超过了这个的最大限制,mysql会给你其他的类型。

      存储和读取时都需要对标记进行操作,而标记的长度最长是65535字节,而一个标记只占用一个字节,最多只能有两个标记字节

     总结:如果咋定义的长度等于或者小于传入的长度,char比较节省内存空间;varchar反而会浪费空间;如果定义的长度在大于传入的长度,varchar会节省空间,而char会浪费空间。

     

      还有一些不常用的字符类型:text   blob   binary等等。

     length:查看字节的长度

     char_length:查看字符的长度,这个查看的都是处理后的结果。

     set sql_mode='pad_char_to_full_length':自动填满char定义的长度,不会私自的删除。

    mysql> create table t13(x char(10),
        ->                  y varchar(10));
    Query OK, 0 rows affected (0.51 sec)
     
    mysql> desc t13;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | x     | char(10)    | YES  |     | NULL    |       |
    | y     | varchar(10) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    2 rows in set (0.00 sec)
     
    mysql> insert into t13 values('fang','fang');
    Query OK, 1 row affected (0.05 sec)
     
    mysql> select * from t13;
    +------+------+
    | x    | y    |
    +------+------+
    | fang | fang |
    +------+------+
    1 row in set (0.03 sec)
     
    mysql> select char_length(x),char_length(y) from t13;
    +----------------+----------------+
    | char_length(x) | char_length(y) |
    +----------------+----------------+
    |              4 |              4 |
    +----------------+----------------+
    1 row in set (0.00 sec)
     
    mysql> set sql_mode='pad_char_to_full_length';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
     
    mysql> select char_length(x),char_length(y) from t13;
    +----------------+----------------+
    | char_length(x) | char_length(y) |
    +----------------+----------------+
    |             10 |              4 |
    +----------------+----------------+
    1 row in set (0.00 sec)

    四 枚举类型和集合类型

     enum:单选,可以插入多个值,传入时只能传入一个值。传入的值不是插入值的范围,就会传入一个空。

     set:可以插入多个值,传入值时剋有传入多个,如果传入的内容不在该范围,就会传入一个空。

    mysql> create table t14(name char(10),
        ->                  sex enum('male','female','男','女'),
        ->                  honnies set('ect','paly','wark','le','lanqiu'));
    Query OK, 0 rows affected (0.23 sec)
     
    mysql> insert into t14 values('fang','male','ect,paly,wark')
        -> ;
    Query OK, 1 row affected (0.03 sec)
     
    mysql> select * from t14;
    +------------+------+---------------+
    | name       | sex  | honnies       |
    +------------+------+---------------+
    | fang       | male | ect,paly,wark |
    +------------+------+---------------+
    1 row in set (0.00 sec)

    default:设置一个默认值。

    mysql> create table t15(sex enum('male','female','男','女') not null default 'female',
        ->                  aa set('cet','wark','paly') not null default 'cet');
    Query OK, 0 rows affected (0.24 sec)
     
    mysql> insert into t15 value();
    Query OK, 1 row affected (0.04 sec)
     
    mysql> select * from t15;
    +--------+-----+
    | sex    | aa  |
    +--------+-----+
    | female | cet |
    +--------+-----+
    1 row in set (0.00 sec)

    这两个传入的参数最好都是字符串。

    五 约束条件

     1 not null和null:null是为空,而not null是不为空。

      default:设置默认值

      unique:唯一

     2 key:加速数据查询

      primary key:主键,一个表里面只能有一个主键,并且是不为空且唯一。

      unique key:设置唯一,可以为空。

      foreign key:建立表于表之间的关系。

      auto_increment:自增。必须在定义key,一般在key后面使用,除foregin key以外。

      auto_increment_increment:定义长度

      auto_increment_offset:定义初始值

       这两个自带属性

        set session:会话,一个会话等于一次连接

        set global  :表全局修改数据他们直接相互影响。

        %:代替任意字符

        根据自增有关的配置:初始值的那个值不能大于定义的步长。初始值一定要小于步长,步长默认为1.

     详情:http://www.cnblogs.com/linhaifeng/articles/7238814.html

    #基于会话级别
        set session auto_increment_increment=2 #修改会话级别的步长
     
        #基于全局级别的
        set global auto_increment_increment=2 #修改全局级别的步长(所有会话都生效)
        set global auto_increment_offset=2;
     
    #初始值(auto_increment_offset)一定要 <= 步长(auto_increment_increment)
     
    create table t4(id int primary key auto_increment,name char(10));
     
    set global auto_increment_increment=3;
    set global auto_increment_offset=2;
     
     
    mysql> use day43;
    Database changed
    mysql> create table t5(id int primary key auto_increment,name char(10));
    Query OK, 0 rows affected (0.35 sec)
     
    mysql> desc t5;
    +-------+----------+------+-----+---------+----------------+
    | Field | Type     | Null | Key | Default | Extra          |
    +-------+----------+------+-----+---------+----------------+
    | id    | int(11)  | NO   | PRI | NULL    | auto_increment |
    | name  | char(10) | YES  |     | NULL    |                |
    +-------+----------+------+-----+---------+----------------+
    2 rows in set (0.01 sec)
     
    mysql> show create table t5;
    +-------+------------------------------------------------------------------------------------
    | Table | Create Table
    +-------+------------------------------------------------------------------------------------
    | t5    | CREATE TABLE `t5` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `name` char(10) DEFAULT NULL,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
    +-------+------------------------------------------------------------------------------------
    1 row in set (0.00 sec)
     
    mysql> insert into t5(name) values('aaaa');
    Query OK, 1 row affected (0.08 sec)
     
    mysql> select * from t5;
    +----+------+
    | id | name |
    +----+------+
    |  2 | aaaa |
    +----+------+
    1 row in set (0.00 sec)
     
    mysql> insert into t5(name) values('bbbb');
    Query OK, 1 row affected (0.06 sec)
     
    mysql> select * from t5;
    +----+------+
    | id | name |
    +----+------+
    |  2 | aaaa |
    |  5 | bbbb |
    +----+------+
    2 rows in set (0.00 sec)
    

      

      constraint:定义约束条件,后面加上约束条件,括号里写入字段。

      一张表只能够有一个主键,但是可以有多个非空且唯一的约束条件。而mysql将第一个非空且唯一的字段设置为主键。

      在一张表中,not null unique可以有多个。

      什么是联合唯一:在定义后,加上一个额约束条件,然后将需要约束的是字段添加到括号里面,多个字段同时在一起加上约束条件,就叫做联合唯一。

    mysql> create table SIT(s_id int primary key auto_increment,
        -> s_name char(5) not null,
        -> gender enum('男','女') not null,
        -> caption char(10) not null,
        -> c_name CHAR(5) not null,
        -> number int not NULL,
        -> t_name char(5) not null,
        -> unique(s_name,caption,c_name,t_name));
    Query OK, 0 rows affected (0.25 sec)
     
    mysql> show tables;
    +---------------+
    | Tables_in_jie |
    +---------------+
    | class         |
    | course        |
    | fang          |
    | fang1         |
    | score         |
    | sit           |
    | student       |
    | t1            |
    | t2            |
    | t3            |
    | t4            |
    | t5            |
    | t7            |
    | t8            |
    | teacher       |
    +---------------+
    15 rows in set (0.00 sec)
     
    mysql> desc sit;
    +---------+-----------------+------+-----+---------+----------------+
    | Field   | Type            | Null | Key | Default | Extra          |
    +---------+-----------------+------+-----+---------+----------------+
    | s_id    | int(11)         | NO   | PRI | NULL    | auto_increment |
    | s_name  | char(5)         | NO   | MUL | NULL    |                |
    | gender  | enum('男','女') | NO   |     | NULL    |                |
    | caption | char(10)        | NO   |     | NULL    |                |
    | c_name  | char(5)         | NO   |     | NULL    |                |
    | number  | int(11)         | NO   |     | NULL    |                |
    | t_name  | char(5)         | NO   |     | NULL    |                |
    +---------+-----------------+------+-----+---------+----------------+
    7 rows in set (0.00 sec)
    

     总结:如果插入的记录错误,自增的机制也会自动的加下去。 

  • 相关阅读:
    Mysql Bypass小结
    SQLite手工注入方法小结
    bodgeit测试平台
    Sqlite注入测试
    ASP代码审计学习笔记 -3.上传漏洞
    centos7环境下apache2.2.34的编译安装
    centos7.6环境下编译安装tengine-2.2.2的编译安装
    centos7.6编译安装php7.2.11及redis/memcached/rabbitmq/openssl/curl等常见扩展
    Windows2016的 IIS中配置PHP7运行环境
    服务器资源迁移到aliyun对象存储及oss的权限管理配置
  • 原文地址:https://www.cnblogs.com/bsxq/p/7731568.html
Copyright © 2011-2022 走看看