zoukankan      html  css  js  c++  java
  • MySQL学习总结之路(第三章:数据类型)

    目录

    MySQL学习总结之路(第一章:服务与数据库管理)

    MySQL学习总结之路(第二章:表)

    MySQL学习总结之路(第三章:数据类型)

    MySQL学习总结之路(第四章:运算符)

    MySQL学习总结之路(第五章:函数)

    MySQL学习总结之路(第六章:表类型【存储引擎】的选择)

    1、数值类型

    1.1、数值类型分类

    严格数值类型(INTEGER、SMALLINT、DECIMAL 和 NUMERIC)
    近似数值数据类型(FLOAT、REAL 和 DOUBLE PRECISION)
    MySQL中数值类型
    整数类型 字节  最小值 最大值
    TINYINT
    1
    有符号-128
    无符号 0
    有符号 127
    无符号 255
    SMALLINT
    有符号-32768
    无符号 0
    有符号 32767
    无符号 65535 
    MEDIUMINT 
    有符号-8388608
    无符号 0
    有符号 8388607
    无符号 1677215
    INT、INTEGER
    4
    有符号-2147483648
    无符号 0 
    有符号 2147483647
    无符号 4294967295
    BIGINT
    8
    有符号-9223372036854775808
    无符号 0
    有符号 9223372036854775807
    无符号 18446744073709551615
    浮点数类型
    字节
    最小值 最大值
    FLOAT 
    ±1.175494351E-38 
    ±3.402823466E+38 
    DOUBLE 
    8
    ±2.2250738585072014E-308 
    ±1.7976931348623157E+308 
    定点数类型 
    字节 描述
    DEC(M,D),
    DECIMAL(M,D) 
    M+2
    最大取值范围与 DOUBLE 相同,给定 DECIMAL 的有效取值范围由 M 和 D
    决定
    位类型 
    字节
    最小值 最大值
    BIT(M)
    1~8 
    BIT(1)
    BIT(64) 
     

    1.1.1、浮点数

    浮点数如果不写精度和标度,则会按照实际精度值显示,如果有精度和标度,则会自动将四舍五入后的结果插入,系统不会报错;定点数如果不写精度和标度,则按照默认值 decimal(10,0)来进行操作,并且如果数据超越了精度和标度值,系统则会报错。

    1.1.2、位类型

    BIT(位)类型:范围从1-64,如果不写,默认为1位,对于此字段,直接使用select命令将不会看到结果,可以用bin()(显示为二进制格式)或者hex()(显示为16进制格式)函数进行读取
    例:
    mysql> desc t2;
    +-------+--------+------+-----+---------+-------+
    | Field | Type   | Null | Key | Default | Extra |
    +-------+--------+------+-----+---------+-------+
    | id    | bit(1) | YES  |     | NULL    |       |
    +-------+--------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    mysql> insert into t2 values(1);
    Query OK, 1 row affected (0.05 sec)
    
    mysql> select * from t2;
    +------+
    | id   |
    +------+
    |     |
    +------+
    1 row in set (0.00 sec)
    
    mysql> select bin(id),hex(id) from t2;
    +---------+---------+
    | bin(id) | hex(id) |
    +---------+---------+
    | 1       | 1       |
    +---------+---------+
    1 row in set (0.03 sec)

    bit类型数据插入时,首先将值转换为二进制,如果允许,则进行插入,如果位数小于实际定义的位数,则插入失败。

    例:如果在刚刚的那张表中插入2,实际转换为二进制为10,超出了bit(1)的实际定义位数,就会报异常,将id定义为bit(2),在插入,就会成功

    mysql> insert into t2 values(2);
    ERROR 1406 (22001): Data too long for column 'id' at row 1
    mysql> alter table t2 modify id bit(2);
    Query OK, 1 row affected (0.67 sec)
    Records: 1  Duplicates: 0  Warnings: 0
    
    mysql> insert into t2 values(2);
    Query OK, 1 row affected (0.03 sec)
    
    mysql> select bin(id),hex(id) from t2;
    +---------+---------+
    | bin(id) | hex(id) |
    +---------+---------+
    | 1       | 1       |
    | 10      | 2       |
    +---------+---------+
    2 rows in set (0.00 sec)

    1.1.3、时间日期类型

    日期和时间类型 字节 最小值 最大值
    DATE 
    1000-01-01 
    9999-12-31 
    DATETIME
    1000-01-01 00:00:00
    9999-12-31 23:59:59 
    TIMESTAMP
    4
    19700101080001 
    2038 年的某个时刻 
    TIME 
    -838:59:59
    838:59:59 
    YEAR
    1 1901
    2155 

    DATE:用来表示年月日

    DATETIME:用来表示年月日时分秒(支持插入格式:2007-9-3 12:10:10'、'2007/9/3 12+10+10'、'20070903121010'、20070903121010 等)

    TIME:只用来表示时分秒

    TIMESTAMP:经常插入或者更新日期为当前系统时间

    YEAR:表示年

    例1:创建时间表(dt),字段分别为 date、time、datetime 三种日期类型,并插入数值,查看显示结果

    mysql> create table dt(d date,t time,dt datetime);
    Query OK, 0 rows affected (0.23 sec)
    
    
    mysql> insert into dt values(now(),now(),now());
    Query OK, 1 row affected, 1 warning (0.05 sec)
    
    mysql> select * from dt;
    +------------+----------+---------------------+
    | d          | t        | dt                  |
    +------------+----------+---------------------+
    | 2021-05-13 | 10:14:07 | 2021-05-13 10:14:07 |
    +------------+----------+---------------------+
    1 row in set (0.00 sec)

     例2:创建测试表t,字段id1为TIMESTAMP类型,插入空值,并显示

    mysql> create table t(id1 timestamp);
    Query OK, 0 rows affected (0.22 sec)
    
    mysql> insert into t values(null);
    Query OK, 1 row affected (0.05 sec)
    
    mysql> select * from t;
    +---------------------+
    | id1                 |
    +---------------------+
    | 2021-05-13 10:18:05 |
    +---------------------+
    1 row in set (0.00 sec)
    可以发现,系统给 id1 自动创建了默认值 CURRENT_TIMESTAMP(系统日期)。(注意,MySQL只给表中的第一个TIMESTAMP字段设置默认值为系统日期,如果有第二个TIMESTAMP类型,则默认值设置为0值)
    例3:解释如上说明
    mysql> alter table t add column id2 timestamp;
    Query OK, 0 rows affected (0.48 sec)
    Records: 0  Duplicates: 0  Warnings: 0
    
    mysql> show create table t G;
    *************************** 1. row ***************************
           Table: t
    Create Table: CREATE TABLE `t` (
      `id1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `id2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00'
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1
    1 row in set (0.00 sec)
    
    ERROR:
    No query specified

     1.1.4、字符串类型

    字符串类型 字节 描述及存储需求
    CHAR(M) 
    M
    M 为 0~255 之间的整数
    VARCHAR(M)
     
    M 为 0~65535 之间的整数,值的长度+1 个字节
    TINYBLOB
     
    允许长度 0~255 字节,值的长度+1 个字节
    BLOB 
     
    允许长度 0~65535 字节,值的长度+2 个字节
    MEDIUMBLOB
     
    允许长度 0~167772150 字节,值的长度+3 个字节
    LONGBLOB
     
    允许长度 0~4294967295 字节,值的长度+4 个字节
    TINYTEXT
     
    允许长度 0~255 字节,值的长度+2 个字节 
    TEXT 
     
    允许长度 0~65535 字节,值的长度+2 个字节 
    MEDIUMTEXT 
     
    允许长度 0~167772150 字节,值的长度+3 个字节
    LONGTEXT 
     
    允许长度 0~4294967295 字节,值的长度+4 个字节
    VARBINARY(M)
     
    允许长度 0~M 个字节的变长字节字符串,值的长度+1 个字节
    BINARY(M) 
    M
    允许长度 0~M 个字节的定长字节字符串 

    CHAR:固定长度,在检索时,会删除尾部的空格

    VARCHAR:可变长字符串,在检索时,会保留这些空格

    例:

    mysql> create table varc(v varchar(4),c char(4));
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> insert into varc values('abc ','abc ');
    Query OK, 1 row affected (0.03 sec)
    
    mysql> select length(v),length(c) from varc;
    +-----------+-----------+
    | length(v) | length(c) |
    +-----------+-----------+
    |         4 |         3 |
    +-----------+-----------+
    1 row in set (0.01 sec)
    mysql> select concat(v,'+'),concat(c,'+') from varc;
    +---------------+---------------+
    | concat(v,'+') | concat(c,'+') |
    +---------------+---------------+
    | abc +         | abc+          |
    +---------------+---------------+
    1 row in set (0.00 sec)
    BINARY:类似于char,但他是二进制字符串
    VARBINARY:类似于varchar,单他是存储二进制字符串
    例:
    mysql> create table bina(c binary(3));
    Query OK, 0 rows affected (0.22 sec)
    
    mysql> insert into t set c='a';
    ERROR 1054 (42S22): Unknown column 'c' in 'field list'
    mysql> insert into bina set c='a';
    Query OK, 1 row affected (0.05 sec)
    
    mysql> select *,hex(c),c='a',c='a',c='a' from bina;
    +------+--------+-------+---------+-----------+
    | c    | hex(c) | c='a' | c='a' | c='a' |
    +------+--------+-------+---------+-----------+
    | a    | 610000 |     0 |       0 |         1 |
    +------+--------+-------+---------+-----------+
    1 row in set (0.00 sec)
    可以发现,当保存 BINARY 值时,在值的最后通过填充“0x00”(零字节)以达到指定的字段定义长度。从上例中看出,对于一个 BINARY(3)列,当插入时'a'变为'a'

    1.1.5、ENUM 类型

    ENUM:对 1~255 个成员的枚举需要 1 个字节存储;对于 255~65535 个成员,需要 2 个字节存储。
    例:
    mysql> create table gend(gender enum('M','F'));
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> insert into gend values('M'),('F'),('1'),(null);
    Query OK, 4 rows affected (0.03 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> select * from gend;
    +--------+
    | gender |
    +--------+
    | M      |
    | F      |
    | M      |
    | NULL   |
    +--------+
    4 rows in set (0.00 sec)

    由此可以看出,枚举类型的插入值得时候,是忽略大小写的,初始下标从1开始;查询的时候会转换为大写,也可以插入空(null)

    1.1.6、SET类型

    SET:字符串对象,里面可以包含64个成员,成员不同,存储上也有所不同

    1~8 成员的集合,占 1 个字节。
    9~16 成员的集合,占 2 个字节。
    17~24 成员的集合,占 3 个字节。
    25~32 成员的集合,占 4 个字节。
    33~64 成员的集合,占 8 个字节。
    Set和EMUN区别在于,Set一次可以选则多个成员,而ENUM则只能选择一个
    例:
    mysql> create table st(col set('a','b','c','d'));
    Query OK, 0 rows affected (0.20 sec)
    
    mysql> insert into st values('a,b'),('a,d,a'),('a,c'),('a');
    Query OK, 4 rows affected (0.03 sec)
    Records: 4  Duplicates: 0  Warnings: 0
    
    mysql> insert into st values('f');
    ERROR 1265 (01000): Data truncated for column 'col' at row 1
    mysql> insert into st values(null);
    Query OK, 1 row affected (0.03 sec)
    
    mysql> select * from st;
    +------+
    | col  |
    +------+
    | a,b  |
    | a,d  |
    | a,c  |
    | a    |
    | NULL |
    +------+
    5 rows in set (0.00 sec)

    由此可以看出,set是可以插入多个成员的,也可以插入null,插入不存在的定义列时,会报异常插入失败

    此章节完成

     

     

     

  • 相关阅读:
    【One by one系列】一步步开始使用Redis吧(一)
    Double.valueOf()与Double.parseDouble()两者的区别
    eclipse配置SVN
    java中String.valueOf(obj)、(String)obj与obj.toString()有什么区别
    zookeeper+dubbo【转载】
    jquery中的attr与prop
    window上安装rabbitMQ
    控制 输入框 只能输入数字、小数、负数
    关于JavaScript的事件触发
    JavaScript学习第四天
  • 原文地址:https://www.cnblogs.com/19930521zhang/p/14756392.html
Copyright © 2011-2022 走看看