zoukankan      html  css  js  c++  java
  • MySQL数据类型

    数值类型

    整数类型

    当插入的数值超出类型的范围时,只保留到最大范围值。

    约束类型是有符号还是无符号:

    1. 默认的整数类型为有符号数。

    2. 指定无符号用unsigned

    例:create table t1(x tinyint unsigned) 注:tinyint 有符号范围-128至127,无符号为0至255。

    【重点】对于整形类型,MySQL的宽度限制不是限定类型的数值宽度,而是限制显示宽度,(即,在用select语句查询的时候,在表格显示的宽度,只有数值小于限制宽度时才有效果,超出宽度值,按数值的实际长度显示)

    加入zerofill在语句的最后,表示用零填充。
    例如:create table t1(id int(5) unsigned zerofill);
    创建一个表,类型为int ,宽度为5 无符号,少位用0添加。
    
    ======用zerofill测试整数类型的显示宽度=============
    MariaDB [db1]> create table t7(x int(3) zerofill);
    MariaDB [db1]> insert into t7 values
        -> (1),
        -> (11),
        -> (111),
        -> (1111);
    MariaDB [db1]> select * from t7;
    +------+
    | x    |
    +------+
    |  001 |
    |  011 |
    |  111 |
    | 1111 | #超过宽度限制仍然可以存
    +------+

     int的存储宽度是4个Bytes,即32个bit,即2**32
    无符号最大值为:4294967296-1
    有符号最大值:2147483648-1
    有符号和无符号的最大数字需要的显示宽度均为10,而针对有符号的最小值则需要11位才能显示完全,所以int类型默认的显示宽度为11是非常合理的

    最后:整形类型,其实没有必要指定显示宽度,使用默认的就ok

    浮点类型

    定点数类型 DEC等同于DECIMAL

    浮点类型:FLOAT DOUBLE

    作用:存储薪资、身高、体重、体质参数等

    注:DOUBLE 比 FLOAT的精度更高,DEC的精度最高。

    DOUBLE 与 FLOAT 都是 小数点前255位,小数点后30位的范围。

    DEC是 小数点前65位,小数点后30位的范围。

    例:create table t1(id float(255,30));创建一个表的ID是浮点数255位长,小数30位。

        ======================================
    #FLOAT[(M,D)] [UNSIGNED] [ZEROFILL]
    
    定义:
            单精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
    
    有符号:
               -3.402823466E+38 to -1.175494351E-38,
               1.175494351E-38 to 3.402823466E+38
    无符号:
               1.175494351E-38 to 3.402823466E+38
    
    
    精确度: 
               **** 随着小数的增多,精度变得不准确 ****
    
    
    ======================================
    #DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
    
    定义:
               双精度浮点数(非准确小数值),m是数字总个数,d是小数点后个数。m最大值为255,d最大值为30
    
    有符号:
               -1.7976931348623157E+308 to -2.2250738585072014E-308
               2.2250738585072014E-308 to 1.7976931348623157E+308
    
    无符号:
               2.2250738585072014E-308 to 1.7976931348623157E+308
    
    精确度:
               ****随着小数的增多,精度比float要高,但也会变得不准确 ****
    
    ======================================
    decimal[(m[,d])] [unsigned] [zerofill]
    
    定义:
              准确的小数值,m是数字总个数(负号不算),d是小数点后个数。 m最大值为65,d最大值为30。
    
    
    精确度:
               **** 随着小数的增多,精度始终准确 ****
               对于精确数值计算时需要用此类型
               decaimal能够存储精确值的原因在于其内部按照字符串存储。

    日期类型

    DATE TIME DATETIME TIMESTAMP YEAR

    作用:存储用户注册时间,文章发布时间,员工入职时间,出生时间,过期时间等

     YEAR
            YYYY(1901/2155)
    
        DATE
            YYYY-MM-DD(1000-01-01/9999-12-31)
    
        TIME
            HH:MM:SS('-838:59:59'/'838:59:59'DATETIME
    
            YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59    Y)
    
        TIMESTAMP
    
            YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)

    举例:

      ============year===========
    MariaDB [db1]> create table t10(born_year year); #无论year指定何种宽度,最后都默认是year(4)
    MariaDB [db1]> insert into t10 values  
        -> (1900),
        -> (1901),
        -> (2155),
        -> (2156);
    MariaDB [db1]> select * from t10;
    +-----------+
    | born_year |
    +-----------+
    |      0000 |
    |      1901 |
    |      2155 |
    |      0000 |
    +-----------+
    
    
    ============date,time,datetime===========
    MariaDB [db1]> create table t11(d date,t time,dt datetime);
    MariaDB [db1]> desc t11;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | d     | date     | YES  |     | NULL    |       |
    | t     | time     | YES  |     | NULL    |       |
    | dt    | datetime | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    
    MariaDB [db1]> insert into t11 values(now(),now(),now());
    MariaDB [db1]> select * from t11;
    +------------+----------+---------------------+
    | d          | t        | dt                  |
    +------------+----------+---------------------+
    | 2017-07-25 | 16:26:54 | 2017-07-25 16:26:54 |
    +------------+----------+---------------------+
    
    
    
    ============timestamp===========
    MariaDB [db1]> create table t12(time timestamp);
    MariaDB [db1]> insert into t12 values();
    MariaDB [db1]> insert into t12 values(null);
    MariaDB [db1]> select * from t12;
    +---------------------+
    | time                |
    +---------------------+
    | 2017-07-25 16:29:17 |
    | 2017-07-25 16:30:01 |
    +---------------------+
    
    
    
    ============注意啦,注意啦,注意啦===========
    1. 单独插入时间时,需要以字符串的形式,按照对应的格式插入
    2. 插入年份时,尽量使用4位值
    3. 插入两位年份时,<=69,以20开头,比如50,  结果2050      
                    >=70,以19开头,比如71,结果1971
    MariaDB [db1]> create table t12(y year);
    MariaDB [db1]> insert into t12 values  
        -> (50),
        -> (71);
    MariaDB [db1]> select * from t12;
    +------+
    | y    |
    +------+
    | 2050 |
    | 1971 |
    +------+
    
    
    
    ============综合练习===========
    MariaDB [db1]> create table student(
        -> id int,
        -> name varchar(20),
        -> born_year year,
        -> birth date,
        -> class_time time,
        -> reg_time datetime);
    
    MariaDB [db1]> insert into student values
        -> (1,'alex',"1995","1995-11-11","11:11:11","2017-11-11 11:11:11"),
        -> (2,'egon',"1997","1997-12-12","12:12:12","2017-12-12 12:12:12"),
        -> (3,'wsb',"1998","1998-01-01","13:13:13","2017-01-01 13:13:13");
    
    MariaDB [db1]> select * from student;
    +------+------+-----------+------------+------------+---------------------+
    | id   | name | born_year | birth      | class_time | reg_time            |
    +------+------+-----------+------------+------------+---------------------+
    |    1 | alex |      1995 | 1995-11-11 | 11:11:11   | 2017-11-11 11:11:11 |
    |    2 | egon |      1997 | 1997-12-12 | 12:12:12   | 2017-12-12 12:12:12 |
    |    3 | wsb  |      1998 | 1998-01-01 | 13:13:13   | 2017-01-01 13:13:13 |
    +------+------+-----------+------------+------------+---------------------+

    总结:

    创建表:    
    例:  
    create table student(
    id int,
    name char(6),
    born_year year,
    birth_date date,
    class_time time,
    reg_time datetime
    );
    
    插入表:
    insert into student values
    (1,'sly',now(),now(),now(),now());
    
    也可以:
    insert into student values
    (2,'sly2',"1999","1999-9-9","09:09:09","2018-08-08 12:12:12");
    datetime与timestamp的区别
    在实际应用的很多场景中,MySQL的这两种日期类型都能够满足我们的需要,存储精度都为秒,但在某些情况下,会展现出他们各自的优劣。
    下面就来总结一下两种日期类型的区别。
    
    1.DATETIME的日期范围是1001——9999年,TIMESTAMP的时间范围是1970——2038年。
    
    2.DATETIME存储时间与时区无关,TIMESTAMP存储时间与时区有关,显示的值也依赖于时区。在mysql服务器,
    操作系统以及客户端连接都有时区的设置。
    
    3.DATETIME使用8字节的存储空间,TIMESTAMP的存储空间为4字节。因此,TIMESTAMP比DATETIME的空间利用率更高。
    
    4.DATETIME的默认值为null;TIMESTAMP的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),
    如果不做特殊处理,并且update语句中没有指定该列的更新值,则默认更新为当前时间。

    字符串类型

    1. char:定长 (注:大部分用char)
    2. varchar:变长

      例:
      create table t1(name char(5));
      create table t1(name varchar(5));
      注:宽度指的是字符个数
      
      char_length()查看字符长度
      length():查看字节数
      例:
      select char_length(name) from t1;

    注意:char定长类型,在传入表时自动补全缺少的字符(用空格补上),而varchar传入多少就会显示多少,但都是不能超出宽度限制。注,char在取出时系统会自动去掉空格,只返回字符(不包含空格)

    PAD_CHAR_TO_FULL_LENGTH
    #填充 字符 到 完整 长度
    #按字符串原长度存储。
    
    #设置存储模式:sql_mode
    #例:
    SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH'  
    #注意区分大小写 和 双引号。。。。

    注意:mysql只去掉 末尾 空格,前面和中间的不会去掉,在查找时字符串末尾多少个空格都无所谓,会自动去掉。

    1,char填充空格来满足固定长度,但是在查询时却会很不要脸地删除尾部的空格(装作自己好像没有浪费过空间一样),然后修改sql_mode让其现出原形

    mysql> create table t1(x char(5),y varchar(5));
    Query OK, 0 rows affected (0.26 sec)
    
    #char存5个字符,而varchar存4个字符
    mysql> insert into t1 values('你瞅啥 ','你瞅啥 ');
    Query OK, 1 row affected (0.05 sec)
    
    mysql> SET sql_mode='';
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    #在检索时char很不要脸地将自己浪费的2个字符给删掉了,装的好像自己没浪费过空间一样,而varchar很老实,存了多少,就显示多少
    mysql> select x,char_length(x),y,char_length(y) from t1; 
    +-----------+----------------+------------+----------------+
    | x         | char_length(x) | y          | char_length(y) |
    +-----------+----------------+------------+----------------+
    | 你瞅啥    |              3 | 你瞅啥     |              4 |
    +-----------+----------------+------------+----------------+
    row in set (0.00 sec)
    
    #略施小计,让char现出原形
    mysql> SET sql_mode = 'PAD_CHAR_TO_FULL_LENGTH';
    Query OK, 0 rows affected (0.00 sec)
    
    #这下子char原形毕露了......
    mysql> select x,char_length(x),y,char_length(y) from t1;
    +-------------+----------------+------------+----------------+
    | x           | char_length(x) | y          | char_length(y) |
    +-------------+----------------+------------+----------------+
    | 你瞅啥      |              5 | 你瞅啥     |              4 |
    +-------------+----------------+------------+----------------+
    row in set (0.00 sec)
    
    
    #char类型:3个中文字符+2个空格=11Bytes
    #varchar类型:3个中文字符+1个空格=10Bytes
    mysql> select x,length(x),y,length(y) from t1;
    +-------------+-----------+------------+-----------+
    | x           | length(x) | y          | length(y) |
    +-------------+-----------+------------+-----------+
    | 你瞅啥      |        11 | 你瞅啥     |        10 |
    +-------------+-----------+------------+-----------+
    row in set (0.00 sec)

    2,虽然 CHAR 和 VARCHAR 的存储方式不太相同,但是对于两个字符串的比较,都只比 较其值,忽略 CHAR 值存在的右填充,即使将 SQL MODE 设置为 PADCHAR_TOFULLLENGTH 也一样,,但这不适用于like

     #Values in CHAR and VARCHAR columns are sorted and compared according to the character set collation ssigned to the column.
    
        #All MySQL collations are of type PAD SPACE. This means that all CHAR, VARCHAR, and TEXT values are compared 
       #without regard to any trailing spaces. “Comparison” in this context does not include the LIKE pattern-matching operator, for which trailing spaces are significant. For example:
    
        mysql> CREATE TABLE names (myname CHAR(10));
        Query OK, 0 rows affected (0.03 sec)
    
        mysql> INSERT INTO names VALUES ('Monty');
        Query OK, 1 row affected (0.00 sec)
    
        mysql> SELECT myname = 'Monty', myname = 'Monty  ' FROM names;
        +------------------+--------------------+
        | myname = 'Monty' | myname = 'Monty  ' |
        +------------------+--------------------+
        |                1 |                  1 |
        +------------------+--------------------+
        row in set (0.00 sec)
    
        mysql> SELECT myname LIKE 'Monty', myname LIKE 'Monty  ' FROM names;
        +---------------------+-----------------------+
        | myname LIKE 'Monty' | myname LIKE 'Monty  ' |
        +---------------------+-----------------------+
        |                   1 |                     0 |
        +---------------------+-----------------------+
        row in set (0.00 sec)

    总结:

    #常用字符串系列:char与varchar
    #注:虽然varchar使用起来较为灵活,但是从整个系统的性能角度来说,char数据类型的处理速度更快,有时甚至可以超出varchar处理速度的50%。
    #因此,用户在设计数据库时应当综合考虑各方面的因素,以求达到最佳的平衡
    
    #其他字符串系列(效率:char>varchar>text)
    TEXT系列 TINYTEXT TEXT MEDIUMTEXT LONGTEXT
    BLOB 系列    TINYBLOB BLOB MEDIUMBLOB LONGBLOB 
    BINARY系列 BINARY VARBINARY
    
    text:text数据类型用于保存变长的大字符串,可以组多到65535 (2**161)个字符。
    mediumtext:A TEXT column with a maximum length of 16,777,215 (2**241) characters.
    longtext:A TEXT column with a maximum length of 4,294,967,295 or 4GB (2**321) characters.

    LIKE 模糊查询

    例:select name from t1 where name like 'sly';

    注1:在用到模糊查询时,系统不会自动去掉字符后的空格,如字符串有空格,必须在查找时同样加上,否则查不到。

    注2:MySQL规定单个字段的长度不能超过65535个字符个数。

    注3:建表时,char在varchar前面定义,最好再一个表中,要么全用char,要么全用varchar,不要混着用(尽量)

    枚举类型 和 集合类型

    enum:单选,枚举(多个中选一个)
    例:create table test(sex enum('male','female');
    #表示在sex中选其中一个
    
    set:多选,集合(多个选多个)
    例:create table test(hobbies set('play','music','read','study'));
    #表示在hobbies中可以选多项
    
    注:如果没有选择规定范围内的数据,输入后不会报错,但表内对应的项为空。
     
  • 相关阅读:
    [WP]XCTF-Reversing-Newbie_calculations
    [WP]BUUCTF-Reverse-基础题(1-12)
    [WP]XCTF-notsequence
    [WP]XCTF-easyre-153
    [WP]XCTF- 攻防世界-crypto-新手练习区
    [WP]XCTF-simple-check-100
    [WP]XCTF-SignIn
    [WP]XCTF-666
    [WP]XCTF-Reversing-x64Elf-100
    [WP]XCTF-流浪者
  • 原文地址:https://www.cnblogs.com/sly27/p/9129587.html
Copyright © 2011-2022 走看看