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

    MySQL的数据类型

    一、整数类型

    整数类型

    字节

    取值范围

    取值范围

    tinyint

    1

    有符号 -128

    无符号 0

    有符号 127

    无符号 255

    Smallint

    2

    有符号 -32768

    无符号 0

    有符号 32767

    无符号65535

    mediumint

    3

    有符号 -8388608

    无符号 0

    有符号 8388607

    无符号1677215

    int,integer

    4

    有符号 -2147483648

    无符号 0

    有符号 2147483647

    无符号4294967295

    bigint

    8

    有符号 -263

    无符号 0

    有符号 263-1

    无符号264-1

          tinyint、medinumint、int、bigint这个集中类型如果要是操作超出范围的话会显示"Out of range",对于数值的类型我们一般指定数据宽度比如:int(5),如果不指定数值的宽度则默认为int(11)。一般数值在小于指定的宽度的时候,就配合zerofill使用,就是字符空间用0填满。

    创建一个数据库,里面包括id1和id2,指定数值宽度为int和int(5),SQL语句如下

    mysql> create database lianxi;
    Query OK, 1 row affected (0.32 sec)
    
    mysql> use lianxi 
    
    Database changed
    mysql> create table t1(id1 int,id2 int(5));
    Query OK, 0 rows affected (6.14 sec)
    
    mysql> desc t1;
    
    +-------+---------+------+-----+---------+-------+
    | Field | Type | Null | Key | Default | Extra |
    +-------+---------+------+-----+---------+-------+
    | id1 | int(11) | YES | | NULL | |
    | id2 | int(5) | YES | | NULL | |
    +-------+---------+------+-----+---------+-------+
    2 rows in set (0.93 sec)
    mysql> insert into t1(id1,id2) values(111111,111111);            插入111111数据
    
    Query OK, 1 row affected (0.27 sec)
    
    mysql> select * from t1;------------------------------>疑问1?
    +--------+--------+
    | id1    | id2    |
    +--------+--------+
    | 111111 | 111111 |
    +--------+--------+
    1 row in set (0.41 sec)
    
    mysql> insert into t1(id1,id2) values(1111,1111);
    Query OK, 1 row affected (0.04 sec)
    
    mysql> select * from t1;
    +--------+--------+
    | id1    | id2    |
    +--------+--------+
    | 111111 | 111111 |
    |   1111 |   1111 |
    +--------+--------+
    2 rows in set (0.00 sec)
    
    mysql> alter table t1 modify id1 int zerofill;------------------->zerofill让效果更加的明显。
    Query OK, 2 rows affected (3.36 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from t1;
    +------------+--------+
    | id1        | id2    |
    +------------+--------+
    | 0000111111 | 111111 |
    | 0000001111 |   1111 |
    +------------+--------+
    2 rows in set (0.00 sec)
    
    mysql> alter table t1 modify id2 int(5) zerofill;
    Query OK, 2 rows affected (0.41 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    
    mysql> select * from t1;
    +------------+--------+
    | id1        | id2    |
    +------------+--------+
    | 0000111111 | 111111 |
    | 0000001111 |  01111 |
    +------------+--------+
    2 rows in set (0.00 sec)
    
    mysql> 

    有很多人疑问int(5)后面的5是不是表示占用5个字节呢?那么疑问1又怎么解释呢?为什么会显示6个1呢?为什么我设置了5还会显示6个呢?

    其实在int(m)中的m和你占的字节没有关系,我前面的表格中也写了int类型是4个字节,不管m是多少都是4个字节,那m是什么呢,在最后的一个select语句中我给id2添加了zerofill,是不是一目了然呢,不错,m就表示最少显示m个,为什么我输入4个1的时候没有填0呢?那是因为没有添加zerofill,但是系统在存储的时候是要添加0进去的。

    对于小数MySQL有两种方式:浮点数和定点数

          浮点数:double(双精度)

                     float(单精度)

          定点数:decimal:定点数在mysql内部是用字符串形式存储的。所以要比浮点数更加精确,适合表示货币等精确数据。(摘自《深入浅出MySQL》)

    mysql> create table t2(id1 float(5,2) default NULL,id2 double(5,2) NULL,id3 decimal(5,2) default NULL);
    
    Query OK, 0 rows affected (1.04 sec)
    
    mysql> desc t2;
    +-------+--------------+------+-----+---------+-------+
    | Field | Type         | Null | Key | Default | Extra |
    +-------+--------------+------+-----+---------+-------+
    | id1   | float(5,2)   | YES  |     | NULL    |       |
    | id2   | double(5,2)  | YES  |     | NULL    |       |
    | id3   | decimal(5,2) | YES  |     | NULL    |       |
    +-------+--------------+------+-----+---------+-------+
    3 rows in set (0.97 sec)
    
    mysql> 

    我们使用的float和double的精度用法并不是标准的用法,所以精度要求很高的重要数据不建议使用

      无论是定点类型还是浮点类型,如果用户指定的精度超出范围,则会进行四舍五入处理。

    BIT(位)类型,这个是用来存放二进制的数据,BIT(m)这里的m范围是1~64,读取的时候我们要使用bin()或者hex(),用select是查不出数据的。

    二、日期时间类型

    日期和时间类型

    字节

    最小值

    最大值

    Date年月日

    4

    1000-01-01

    9999-12-31

    Datetime年月日时分秒

    8

    1000-01-01 00:00:00

    9999-12-31 23:59:59

    Timestamp时区对应时间

    4

    19700101080001

    20380119111407

    Time单独表示时间

    3

    -838:59:59

    838:59:59

    Year单独表示年

    1

    1901

    2155

    DATE、TIME、DATETIME是经常使用的3中日期类型

    mysql> create table t3(d date,t time,dt datetime);
    
    
    Query OK, 0 rows affected (0.72 sec)
    
    mysql> desc t3;
    +-------+----------+------+-----+---------+-------+
    | Field | Type     | Null | Key | Default | Extra |
    +-------+----------+------+-----+---------+-------+
    | d     | date     | YES  |     | NULL    |       |
    | t     | time     | YES  |     | NULL    |       |
    | dt    | datetime | YES  |     | NULL    |       |
    +-------+----------+------+-----+---------+-------+
    3 rows in set (0.19 sec)
    
    mysql> insert into t3 values(now(),now(),now());
    Query OK, 1 row affected, 1 warning (1.04 sec)
    
    mysql> select * from t3;
    +------------+----------+---------------------+
    | d          | t        | dt                  |
    +------------+----------+---------------------+
    | 2017-03-03 | 06:51:28 | 2017-03-03 06:51:28 |
    +------------+----------+---------------------+
    1 row in set (0.00 sec)
    
    mysql> 

    还有就是TIMESTAMP,他的取值范围19700101080001到2038的某一天,范围相对比较小,而且这个和时区有关系。

    三、字符串类型

    字符串类型

    字节

    描述

    char(m)

    M

    M为0-255之间的整数

    varchar(m)

     

    M为0-65535之间的整数,值的长度为+1个字节

    tinytext

     

    允许长度0-255字节,值为长度+2个字节

    text

     

    允许长度0-65535字节,值为长度+2个字节

    mediumtext

     

    允许长度0~167772150字节值为长度+3个字节

    longtext

     

    允许长度0~4294967295字节值为长度+4个字节

    这个我们最常用到,我们谈谈char和varchar的区别:主要区别就是存储的方式不同char的长度固定为创建表时的声明的长度,而varchar是可变长字符串,在检索的时候,char删除了尾部的空格而varchar则保留这些空格。(摘自《深入浅出MySQL》)

    mysql> create table t4(v varchar(4),c char(4));
    ERROR 2006 (HY000): MySQL server has gone away
    No connection. Trying to reconnect...
    Connection id:    24
    Current database: lianxi
    
    Query OK, 0 rows affected (0.88 sec)
    
    mysql> insert into t4 values('ab ','ab ');------------------------->这里要插入空格
    Query OK, 1 row affected (0.30 sec)
    
    mysql> select length(v),length(c) from t4;
    +-----------+-----------+
    | length(v) | length(c) |
    +-----------+-----------+
    |         3 |         2 |--------------------------------->char类型少了个字节
    +-----------+-----------+
    1 row in set (0.09 sec)
    
    mysql> select concat(v,'+'),concat(c,'+') from t4;------------>添加+,让效果更佳明显
    +---------------+---------------+
    | concat(v,'+') | concat(c,'+') |
    +---------------+---------------+
    | ab +          | ab+           |
    +---------------+---------------+
    1 row in set (0.06 sec)
    
    mysql> 

    如果某一项中设置的是varchar(50)那么对英文当然是50那么对中文呢utf-8的中文占3个字节那么,这个varchar(50)是不是只能存16个汉字了? 不是这样的,mysql低版本之前是这样的,但是5.0以后就不是了mysql varchar(50)  不管中文还是英文都是存50个的,但是一个表中所有varchar字段的总长度跟编码有关,如果是utf-8,那么大概65535/3,如果是gbk,那么大概65535/2编码长度限制字符类型若为gbk,每个字符最多占2个字节字符类型若为utf8,每个字符最多占3个字节。

    ENUM和SET类型:

    enum一般是多选一,我们可以做性别选择,set是多个成员可以选择多个。

    mysql> create table t5(sex enum('man','woman'));
    
    Query OK, 0 rows affected (0.11 sec)
    
    mysql> insert into t5 values('man');
    Query OK, 1 row affected (0.07 sec)
    
    mysql> insert into t5 values('men');
    Query OK, 1 row affected, 1 warning (0.02 sec)
    
    mysql> select * from t5;
    +------+
    | sex  |
    +------+
    | man  |
    |      |
    +------+
    2 rows in set (0.00 sec)
    
    mysql> show warnings;
    Empty set (0.00 sec)
    
    mysql> insert into t5 values('men');
    Query OK, 1 row affected, 1 warning (0.02 sec)
    
    mysql> show warnings;
    +---------+------+------------------------------------------+
    | Level   | Code | Message                                  |
    +---------+------+------------------------------------------+
    | Warning | 1265 | Data truncated for column 'sex' at row 1 |-------------------->看警告
    +---------+------+------------------------------------------+
    1 row in set (0.00 sec)

    mysql> insert into t5 values('man,woman');
    uery OK, 1 row affected, 1 warning (0.04 sec)

    mysql> show warnings;

    +---------+------+------------------------------------------+
    | Level | Code | Message |
    +---------+------+------------------------------------------+
    | Warning | 1265 | Data truncated for column 'sex' at row 1 |
    +---------+------+------------------------------------------+
    1 row in set (0.00 sec)

    mysql> create table t6(raw set('a','b','c'));

    Query OK, 0 rows affected (0.08 sec)

    
    mysql> insert into t6 values('a,b');
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select * from t6;
    +------+
    | raw  |
    +------+
    | a,b  |
    +------+
    1 row in set (0.00 sec)
  • 相关阅读:
    python 上传下载文件
    post方式加载iframe
    js 实现打印功能
    python 判断数据类型
    web样式无法正常显示
    C# 调用python
    PDF转换成Txt
    js预览PDF的插件(亲测支持IE9,火狐,等等)
    文件下载
    asp.net网站发布到服务器GET的技能
  • 原文地址:https://www.cnblogs.com/zhang-yulong/p/6540047.html
Copyright © 2011-2022 走看看