美文网首页
Mysql数据类型

Mysql数据类型

作者: 温柔倾怀 | 来源:发表于2019-08-04 17:26 被阅读0次

    整型

    用于保存整数,常见的有tinyint,smallint,mediumint,int,bigint


    • tinyint(1个字节) < smallint(2个字节) <mediumint(3个字节) < int(4个字节) <bigint(8个字节)
    • 整型分为有符号和无符号
    MariaDB [test]> create table people(
        - > name varchar(32) not null default '' comment '用户名', 
        - > age tinyint unsigned not null default 0 comment '年龄'
        - > )charset=utf8 engine=myisam;
    Query OK, 0 rows affected (0.013 sec)
    
    • 如果不写unsigned,默认是有符号的
    • 有符号和无符号能表示的范围是不同的,有符号要把二进制最左一位拿出来表示符号正负

    关于zerofill的说明

    zerofill叫做0填充
    举例说明:

    MariaDB [test]> create table test(
        -> num int,
        -> num2 int(4) zerofill,
        -> num3 int(4) unsigned zerofill);
    Query OK, 0 rows affected (0.014 sec)
    

    当int(4) zerofill 使用,如果添加的整数不够4位,则数值的左边使用0进行填充.

    MariaDB [test]> insert into test values(1,23,345);
    Query OK, 1 row affected (0.010 sec)
    
    MariaDB [test]> select * from test;
    +------+------+------+
    | num  | num2 | num3 |
    +------+------+------+
    |    1 | 0023 | 0345 |
    +------+------+------+
    1 row in set (0.000 sec)
    

    int(4) 不能理解成最大只能是4位的数,而应该理解成是0填充的宽度

    MariaDB [test]> insert into test values(1,23456,34567);
    Query OK, 1 row affected (0.004 sec)
    
    MariaDB [test]> select * from test;
    +------+-------+-------+
    | num  | num2  | num3  |
    +------+-------+-------+
    |    1 |  0023 |  0345 |
    |    1 | 23456 | 34567 |
    +------+-------+-------+
    2 rows in set (0.000 sec)
    

    当一个字段被zerofill 修饰时,那么这个字段就自动成为unsigned

    MariaDB [test]> insert into test values(1,-1,34567);
    ERROR 1264 (22003): Out of range value for column 'num2' at row 1
    
    • int 如果不规定大小,默认是10
    MariaDB [test]> create table test2(id int zerofill,age int);
    Query OK, 0 rows affected (0.040 sec)
    
    MariaDB [test]> insert into test2 values(1,18);
    Query OK, 1 row affected (0.005 sec)
    
    MariaDB [test]> select * from test2;
    +------------+------+
    | id         | age  |
    +------------+------+
    | 0000000001 |   18 |
    +------------+------+
    1 row in set (0.000 sec)
    

    数值类型-bit

    bit类型就是位类型

    • 基本使用案例
    MariaDB [test]> create table test10(id int,a bit(7));
    Query OK, 0 rows affected (0.005 sec)
    MariaDB [test]> insert into test10 values(1,64);
    Query OK, 1 row affected (0.010 sec)
    MariaDB [test]> select * from test10;
    +------+------+
    | id   | a    |
    +------+------+
    |    1 | @    |
    +------+------+
    1 row in set (0.000 sec)
    这里有一个困惑:a这个字段,bit位数为7的时候刚好,小了不行
    解惑:bit(1) 这里1呢 就是一个bit位,意思是只能有1位来表示你的数据,就只能表示0和1
    
    

    可见,bit字段在显示时,按照对应的ascii码对应的字符显示

    MariaDB [test]> select * from test10 where a=64;
    +------+------+
    | id   | a    |
    +------+------+
    |    1 | @    |
    +------+------+
    1 row in set (0.000 sec)
    
    MariaDB [test]> select * from test10 where a='@';
    Empty set, 1 warning (0.001 sec)
    
    • 查询的时候仍然可以用数值
    • 位类型。默认值是1,范围是1-64,bit(1-64),可以通过bit(M) M值来控制我们填充数据的大小
    • 如果一个值只有一个0,1,可以考虑使用bit(1),可以节约空间,其实实际分配的是一个字节,不能分配一个位
    • bit 类型, 不能手动指定unsigned,其实它本身就会是无符号的

    数值类型--小数

    • 在mysql中使用的最多的是float , decimal
    float(4,2)表示的范围是 -99.99~99.99
    float(4,2) unsigned 表示的范围是 0-99.99
    decimal(5,2)表示的范围是 -999.99~999.99
    decimal(5,2) unsigned 表示的范围是 0-999.99
    指定长度,指定小数点位数
    

    数据类型--字符串

    • 最主要的有三种, 分别是 char,varchar, text
    MariaDB [test]> create table `user300`( 
        -> id int unsigned not null default 0, 
        -> name varchar(64) not null default '', 
        -> post_code char(6) not null default ''
        -> )charset=utf8 engine=myisam;
    Query OK, 0 rows affected (0.013 sec)
    
    MariaDB [test]> insert into user300 values(100,'你好','hello');
    Query OK, 1 row affected (0.010 sec)
    MariaDB [test]> select * from user300;
    +-----+--------+-----------+
    | id  | name   | post_code |
    +-----+--------+-----------+
    | 100 | 你好   | hello     |
    +-----+--------+-----------+
    1 row in set (0.002 sec)
    

    注意:

    • char(n)这个n范围是 1-255
    • varchar(n)这个n的范围和表的字符集有关,如果是utf8,那么n最大是(65535-3)/3 = 21844;如果是gbk,n最大是(65535-3)/2 = 32766;
    • n指的都是字符数而不是字节数,与表的编码无关
    • varchar最大是有65535个字节,要有3个预留字节
    • 因为utf8一个汉字占3个字节;gbk一个汉字占两个字节
    char(4)是定长 这里既是插入的是'aa',也是占用分配的4个字节
    varchar(4)是变长,如果插入了'aa',实际占用空间大小是L+1
    L:实际数据的长度
    加的一个字节用来记录长度 
    
    • char 会将存入的最后的空格自动删除,而varchar会保留
    • 存放文本时,也可以使用text数据类型,不需要规定大小,text不能有默认值,可以将text视为varchar列,可以存放varchar最大的范围
    • 一个表定义的所有字段加起来不能超过65535,如果需求大于65535,我们可以使用text来替代varchar

    数据类型--时间和日期

    date,datetime,timestamp

    MariaDB [test]> create table `user901`(
        -> id int,
        -> birthday date,
        -> cardtime datetime,
        -> login_time timestamp
        -> )charset=utf8 engine=myisam;
    Query OK, 0 rows affected (0.010 sec)
    
    MariaDB [test]> insert into user901 values(100,'2019-8-3','2019-8-8 8:8:4','2011-1-11 11:22:33');
    Query OK, 1 row affected (0.009 sec)
    
    MariaDB [test]> select * from user901;
    +------+------------+---------------------+---------------------+
    | id   | birthday   | cardtime            | login_time          |
    +------+------------+---------------------+---------------------+
    |  100 | 2019-08-03 | 2019-08-08 08:08:04 | 2011-01-11 11:22:33 |
    +------+------------+---------------------+---------------------+
    1 row in set (0.001 sec)
    
    • 对于date,只接收日期
    • datetime,timestamp 均有日期和时间
    • timestamp在insert和update时会自动根据当前时间更新

    数据类型--枚举enum,集合set

    • 对于多选我们可以使用set数据类型
    • 对于单选我们可以使用enum数据类型
    MariaDB [test]> create table `user902`(
        -> id int unsigned not null default 1,
        -> hobby set('A','B','C','D') not null default 'A' comment '选项',
        -> sex enum('男','女') not null default '男' comment '性别'
        -> )charset=utf8 engine=myisam;
    Query OK, 0 rows affected (0.009 sec)
    
    MariaDB [test]> insert into user902 values(100,'A','男');
    Query OK, 1 row affected (0.000 sec)
    
    MariaDB [test]> insert into user902 values(200,'A,B','男');
    Query OK, 1 row affected (0.000 sec)
    
    MariaDB [test]> select * from user902;
    +-----+-------+-----+
    | id  | hobby | sex |
    +-----+-------+-----+
    | 100 | A     | 男  |
    | 200 | A,B   | 男  |
    +-----+-------+-----+
    2 rows in set (0.002 sec)
    
    • 在enum类型中,数字可以替代我们的选项,类似下标理解,第一个选项为1,第二个选项为2,以此类推
    MariaDB [test]> insert into user902 values(300,'C',1);
    Query OK, 1 row affected (0.000 sec)
    
    MariaDB [test]> insert into user902 values(400,'D',2);
    Query OK, 1 row affected (0.000 sec)
    
    MariaDB [test]> select * from user902;
    +-----+-------+-----+
    | id  | hobby | sex |
    +-----+-------+-----+
    | 100 | A     | 男  |
    | 200 | A,B   | 男  |
    | 300 | C     | 男  |
    | 400 | D     | 女  |
    +-----+-------+-----+
    4 rows in set (0.000 sec)
    
    • set中也可以使用数字来替代,标号为1,2,4,6...偶数形式,最大64
    A    B    C    D
    1    2    4    6
    
    7 => 1+2+4
    
    
    • 对set中的值进行查询
    要借助函数
    select * from user where find_in_set('A',hobby);
    find_in_set('A',hobby) 返回'A'在hobby集合中处于第几位
    

    图片电影音频数据应该如何存放?

    通常不会直接存储在数据库汇中,实际开发中存放的是路径地址,然后通过地址去读取。

    head_img varchar(64) //存储路径
    

    创建表练习

    MariaDB [test]> create table employee(
        -> id int unsigned not null default 0 comment '雇员id',
        -> name varchar(64) not null default '' comment '姓名',
        -> sex enum('男','女','保密') not null default '保密' comment '性别',
        -> birthday date not null comment '生日',
        -> entry_date date not null comment '入职时间',
        -> job varchar(32) not null default '' comment '职位',
        -> salary decimal(10,2) not null default 0.0 comment '薪水',
        -> resume text not null comment '个人介绍'
        -> )charset=utf8 engine=myisam;
    Query OK, 0 rows affected (0.004 sec)
    
    • 插入数据
    MariaDB [test]> insert into employee values(100,'小妖怪','男','2001-10-11','2012-11-11','巡山',2300.00,'大王.我来巡山');
    Query OK, 1 row affected (0.001 sec)
    MariaDB [test]> insert into employee values(200,'老妖怪','女','1999-10-11','2010-11-11','捶背',4300.00,'我给大王捶背');
    Query OK, 1 row affected (0.000 sec)
    
    • 查看数据表
    MariaDB [test]> select * from employee;
    +-----+-----------+-----+------------+------------+--------+---------+-----------------------+
    | id  | name      | sex | birthday   | entry_date | job    | salary  | resume                |
    +-----+-----------+-----+------------+------------+--------+---------+-----------------------+
    | 100 | 小妖怪    | 男  | 2001-10-11 | 2012-11-11 | 巡山   | 2300.00 | 大王叫我来巡山        |
    | 200 | 老妖怪    | 女  | 1999-10-11 | 2010-11-11 | 捶背   | 4300.00 | 我给大王捶背          |
    +-----+-----------+-----+------------+------------+--------+---------+-----------------------+
    2 rows in set (0.002 sec)
    
    • 小技巧:如何对齐数据
        登录mysql的时候
        mysql -u root -p --dafault-character-set=latin1
        进入mysql之后 set names gbk;
    

    相关文章

      网友评论

          本文标题:Mysql数据类型

          本文链接:https://www.haomeiwen.com/subject/stirdctx.html