精华内容
下载资源
问答
  • 最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint;接下来将详细介绍以上三种类型的应用
  • 整数数据类型smallint

    千次阅读 2020-02-29 23:45:36
    文章目录1.1 smallint说明1.2 测试环境说明1.3 加unsigned属性1.3.1 SQL模式开启严格模式1.3.2 SQL模式未开启严格模式1.4 加zerofill属性1.4.1 SQL模式开启严格模式1.4.2 SQL模式未开启严格模式1.5 不加unsigned和...

    1.1 smallint说明

    数据类型显示长度占用字节有符号无符号
    smallint加上unsigned/zerofill:5
    不加unsigned/zerofill:6
    2(16bit)-32768至327670至65535
    ## 格式
    id       smallint(M)                 [unsigned]      [zerofill]
    字段名  数据类型(显示长度,建表时不指定)    无符号       无符号且前导零填充
    
    ## 关于smallint最大数值是怎样得来的
    smallint占用2字节,2字节占用16位,经过换算(2的16次方减1)就是65535
    
    ## 关于加上unsigned后的说明
    加上unsigned后就是无符号(范围是0~65535的整数,因为是整数,不会有符号"-",所以就是无符号)
    
    ## 关于加上zerofill后的说明
    zerofill会把unsigned属性也给带上,这样就是无符号(范围是0~65535,显示长度就是5),同时还会进
    行前导零填充(没有达到显示长度的数值,例如:你插入1,显示的是00001)。
    
    ## 不加unsigned和zerofill的说明
    字段后面不加上这两个属性中的任何一个,就表示是有符号(范围是-32768~32767,因为有符号"-",所有是有符号)

    1.2 测试环境说明

    ## 数据库版本和默认的存储引擎
    mysql> select @@version,@@default_storage_engine;
    +------------+--------------------------+
    | @@version  | @@default_storage_engine |
    +------------+--------------------------+
    | 5.7.28-log | InnoDB                   |
    +------------+--------------------------+
    1 row in set (0.00 sec)
     
    ## 创建chenliang库
    mysql> create database if not exists chenliang;
    Query OK, 1 row affected (0.03 sec)
     
    mysql> show databases like "chenliang";
    +----------------------+
    | Database (chenliang) |
    +----------------------+
    | chenliang            |
    +----------------------+
    1 row in set (0.03 sec)
     
    ## 进入chenliang库
    mysql> use chenliang;
    Database changed
     
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | chenliang  |
    +------------+
    1 row in set (0.01 sec)
     
    ## 查看事务是否自动提交
    mysql> select @@global.autocommit;
    +---------------------+
    | @@global.autocommit |
    +---------------------+
    |                   1 |
    +---------------------+
    1 row in set (0.00 sec)
    

    1.3 加unsigned属性

    1.3.1 SQL模式开启严格模式

    SQL_MODE中开启了严格模式,即SQL_MODE参数中包含STRICT_TRANS_TABLES参数

    ## 设置会话模式下sql_mode中包含strict_trans_tables变量
    mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
     
    ## 创建test1测试表(这里指定了UNSIGNED,也就是无符号)
    mysql> CREATE TABLE IF NOT EXISTS test1(
        -> id smallint UNSIGNED
        -> )engine=innodb character set utf8 collate utf8_general_ci;
    Query OK, 0 rows affected (0.03 sec)
       ## test1表的id字段指定了unsigned参数,那么id字段的范围就是0~65535
      ## 显示长度为smallint(5),因为65535的长度是5
     
    ## 查看test1表的表结构
    mysql> desc test1;
    +-------+----------------------+------+-----+---------+-------+
    | Field | Type                 | Null | Key | Default | Extra |
    +-------+----------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned | YES  |     | NULL    |       |
    +-------+----------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    ## 测试插入范围0~65535的整数和不在该范围内的整数
    mysql> insert into test1(id) values(-1);    # 插入数值-1,报错,不在范围内
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
     
    mysql> insert into test1(id) values(0);     # 插入数值0,正确,在范围内
    Query OK, 1 row affected (0.00 sec)
     
    mysql> insert into test1(id) values(65535); # 插入数值65535,正确,在范围内
    Query OK, 1 row affected (0.01 sec)
     
    mysql> insert into test1(id) values(65536); # 插入数值65536,报错,不在范围内
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
     
    mysql> select * from test1;
    +-------+
    | id    |
    +-------+
    |     0 |
    | 65535 |
    +-------+
    2 rows in set (0.00 sec)
    

    1.3.2 SQL模式未开启严格模式

    SQL_MODE中未开启严格模式,即SQL_MODE参数中不包含STRICT_TRANS_TABLES参数

    ## 设置会话模式下sql_mode中不开启严格模式,即不包含strict_trans_tables变量
    mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected, 1 warning (0.00 sec)
     
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
     
    ## 创建test11表(这里加了unsigned参数哈,也就是无符号)
    mysql> create table if not exists test11(
        -> id smallint unsigned
        -> )engine=innodb character set utf8 collate utf8_general_ci;
    Query OK, 0 rows affected (0.01 sec)
       ## test11表的id字段指定了unsigned参数,那么id字段的范围就是0~65535
      ## 显示长度为smallint(5),因为65535的长度是5
     
    ## 查看test11表的表结构
    mysql> desc test11;
    +-------+----------------------+------+-----+---------+-------+
    | Field | Type                 | Null | Key | Default | Extra |
    +-------+----------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned | YES  |     | NULL    |       |
    +-------+----------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    ## 测试插入范围0~65535的整数和不在该范围内的整数
    mysql> insert into test11(id) values(-1);
    Query OK, 1 row affected, 1 warning (0.01 sec)
      ## 不在范围内,插入未报错(因为sql_mode中没有开启严格模式)
      ## 插入到表中的数据不是-1,而是0
         
    mysql> insert into test11(id) values(0);
    Query OK, 1 row affected (0.00 sec)
       ## 在范围内,插入未报错,插入的是多少就是多少
     
    mysql> insert into test11(id) values(65535);
    Query OK, 1 row affected (0.00 sec)
       ## 在范围内,插入未报错,插入的是多少就是多少
     
    mysql> insert into test11(id) values(65536);
    Query OK, 1 row affected, 1 warning (0.00 sec)
      ## 不在范围内,插入未报错(因为sql_mode中没有开启严格模式)
      ## 插入到表中的数据不是65536,而是65535
     
    mysql> select * from test11;
    +-------+
    | id    |
    +-------+
    |     0 |
    |     0 |
    | 65535 |
    | 65535 |
    +-------+
    4 rows in set (0.00 sec)
    

    1.4 加zerofill属性

    1.4.1 SQL模式开启严格模式

    SQL_MODE中开启了严格模式,即SQL_MODE参数中包含STRICT_TRANS_TABLES参数

    ## 设置会话模式下sql_mode中包含strict_trans_tables变量
    mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
     
    ## 创建test2表,(这里指定了zerofill,也就是前导零填充)
    mysql> create table if not exists test2(
        -> id smallint zerofill
        -> )engine=innodb character set utf8 collate utf8_general_ci;
    Query OK, 0 rows affected (0.12 sec)
     
      ## id字段指定了zerofill参数,它会把unsigned参数也带上,那么id字段的范围0~65535;
      ## 显示长度是smallint(5),因为65535的长度是5;
    ## 查看test2表的表结构
    mysql> desc test2;
    +-------+-------------------------------+------+-----+---------+-------+
    | Field | Type                          | Null | Key | Default | Extra |
    +-------+-------------------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned zerofill | YES  |     | NULL    |       |
    +-------+-------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    ## 测试插入范围0~65535的整数和不在该范围内的整数
    mysql> insert into test2(id) values(-1);    # 插入数值-1,报错,不在范围内
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
     
    mysql> insert into test2(id) values(0);     # 插入数值0,正确,在范围内
    Query OK, 1 row affected (0.00 sec)
     
    mysql> insert into test2(id) values(65535); # 插入数值65535,正确,在范围内
    Query OK, 1 row affected (0.01 sec)
     
    mysql> insert into test2(id) values(65536); # 插入数值65536,报错,不在范围内
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    mysql> select * from test2;
    +-------+
    | id    |
    +-------+
    | 00000 |
    | 65535 |
    +-------+
    2 rows in set (0.00 sec)
    

    1.4.2 SQL模式未开启严格模式

    SQL_MODE中未开启严格模式,即SQL_MODE参数中不包含STRICT_TRANS_TABLES参数

    ## 设置会话模式下sql_mode中不开启严格模式,即不包含strict_trans_tables变量
    mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected, 1 warning (0.00 sec)
    
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
    ## 创建test22表(这里加上zerofill参数,前导零填充,同时也会把unsigned参数也带上)
    mysql> create table if not exists test22(
        -> id smallint zerofill
        -> )engine=innodb character set utf8 collate utf8_general_ci;
    Query OK, 0 rows affected (0.01 sec)
       ## id字段指定了zerofill参数,它会把unsigned参数也带上,那么id字段的范围0~65535;
      ## 显示长度是smallint(5),因为65535的长度是5;
    
    ## 查看test22表的表结构
    mysql> desc test22;
    +-------+-------------------------------+------+-----+---------+-------+
    | Field | Type                          | Null | Key | Default | Extra |
    +-------+-------------------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned zerofill | YES  |     | NULL    |       |
    +-------+-------------------------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
     
    ## 测试插入范围0~65535的整数和不在该范围内的整数
    mysql> insert into test22(id) values(-1);
    Query OK, 1 row affected, 1 warning (0.00 sec)
      ## 不在范围内,插入未报错(因为sql_mode中未开启严格模式)
      ## 插入到表中的数据不是-1,而是0,但显示的时候会前导零填充,因为有zerofill参数
     
    mysql> insert into test22(id) values(0);
    Query OK, 1 row affected (0.01 sec)
      ## 在范围内,插入未报错,插入是什么就是什么,
      ## 但因为有zerofill参数,显示时就会前导零填充
     
    mysql> insert into test22(id) values(65535);
    Query OK, 1 row affected (0.00 sec)
      ## 在范围内,插入未报错,插入是什么就是什么
     
    mysql> insert into test22(id) values(65536);
    Query OK, 1 row affected, 1 warning (0.00 sec)
      ## 不在范围内,插入未报错(因为sql_mode中未开启严格模式)
      ## 插入到表中的数据不是65536,而是65535
         
    mysql> select * from test22;
    +-------+
    | id    |
    +-------+
    | 00000 |
    | 00000 |
    | 65535 |
    | 65535 |
    +-------+
    4 rows in set (0.00 sec)
    

    1.5 不加unsigned和zerofill属性

    1.5.1 SQL模式开启严格模式

    SQL_MODE中开启了严格模式,即SQL_MODE参数中包含STRICT_TRANS_TABLES参数

    ## 设置会话模式下sql_mode中包含strict_trans_tables变量
    mysql> set session sql_mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected (0.00 sec)
     
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
     
    ## 创建test3表(不加unsigned和zerofill)
    mysql> create table if not exists test3(
        -> id smallint
        -> )engine=innodb character set utf8 collate utf8_general_ci;
    Query OK, 0 rows affected (0.08 sec)
      ## test3表的id字段没指定unsigned和zerofill参数,那么id字段范围就是-32768~32767
      ## 因为要显示符号("-"),可以显示长度是smallint(6)
     
    ## 查看test3表的表结构
    mysql> desc test3;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | smallint(6) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
     
    ## 测试插入-32768~32767范围内的整数和不在该范围内的整数
    mysql> insert into test3(id) values(-32769);   #插入数值-32769,错误,不在范围内
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
     
    mysql> insert into test3(id) values(-32768);   #插入数值-32768,正确,在范围内
    Query OK, 1 row affected (0.01 sec)
     
    mysql> insert into test3(id) values(32767);    #插入数值32767,正确,在范围内
    Query OK, 1 row affected (0.00 sec)
     
    mysql> insert into test3(id) values(32768);    #插入数值32768,错误,不在范围内
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
     
    mysql> select * from test3;
    +--------+
    | id     |
    +--------+
    | -32768 |
    |  32767 |
    +--------+
    2 rows in set (0.00 sec)
    

    1.5.2 SQL模式未开启严格模式

    SQL_MODE中未开启严格模式,即SQL_MODE参数中不包含STRICT_TRANS_TABLES参数

    ## 设置会话模式下sql_mode中不开启严格模式,即不包含strict_trans_tables变量
    mysql> set session sql_mode="NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION";
    Query OK, 0 rows affected, 1 warning (0.00 sec)
     
    mysql> select @@sql_mode\G
    *************************** 1. row ***************************
    @@sql_mode: NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
    1 row in set (0.00 sec)
     
    ## 创建test33表(不加zerofill和unsigned参数)
    mysql> create table if not exists test33(
        -> id smallint
        -> )engine=innodb character set utf8 collate utf8_general_ci;
    Query OK, 0 rows affected (0.00 sec)
      ## test33表的id字段没指定unsigned和zerofill参数,那么id字段范围就是-32768~32767
      ## 因为要显示符号("-"),可以显示长度是smallint(6)
    
    ## 查看test33表的表结构
    mysql> desc test33;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | smallint(6) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
     
    ## 测试插入-32768~32767范围内的整数和不在该范围内的整数
    mysql> insert into test33(id) values(-32769);
    Query OK, 1 row affected, 1 warning (0.00 sec)
      ## 不在范围内,插入未报错(因为sql_mode中没有开启严格格式)
      ## 插入的数据不是-32769,而是-32768
     
    mysql> insert into test33(id) values(-32768);
    Query OK, 1 row affected (0.01 sec)
      ## 在范围内,插入不会报错,插入的是什么就是什么
     
    mysql> insert into test33(id) values(32767);
    Query OK, 1 row affected (0.00 sec)
      ## 在范围内,插入不会报错,插入的是什么就是什么
     
    mysql> insert into test33(id) values(32768);
    Query OK, 1 row affected, 1 warning (0.00 sec)
      ## 不在范围内,插入未报错(因为sql_mode中没有开启严格格式)
      ## 插入的数据不是32768,而是32767
     
    mysql> select * from test33;
    +--------+
    | id     |
    +--------+
    | -32768 |
    | -32768 |
    |  32767 |
    |  32767 |
    +--------+
    4 rows in set (0.00 sec)
    
    展开全文
  • smallint类型说明 类 型:smallint 长 度:5 占用字节:2字节 有 符 号:-32768~32767 无 符 号:0~65535 id smalint(M) [UNSIGNED] [ZEROFILL] 字段名 字段类型(长度) [无符号] [前导填充] ...

    smallint类型说明

    类   型:smallint
    长   度:5
    占用字节:2字节
    有 符 号:-32768~32767
    无 符 号:0~65535
    
    id       smalint(M)  [UNSIGNED]  [ZEROFILL] 
    字段名   字段类型(长度)   [无符号]    [前导填充]
    
    unsigned:
    01:smallint(M)后面加上unsigned后,就是无符号(smallint的范围就是0~65535)
    02:smallint(M)后面不加上unsigned,且不加zerofill参数,就是有符号(smallint的范围就是-32768~32767)
    
    zerofill:
    01:进行前导零填充
    02:smallint(M)加上zerofile后,同时也会把unsigned参数也带上(smallint范围0~65535)

    实践环境准备

    -- 创建chenliang库,字符集为utf8
    mysql> create database if not exists chenliang character set utf8 collate utf8_general_ci;
    Query OK, 1 row affected (0.01 sec)
    
    mysql> show databases like "chenliang";
    +----------------------+
    | Database (chenliang) |
    +----------------------+
    | chenliang            |
    +----------------------+
    1 row in set (0.00 sec)
    
    -- 进入chenliang库,并查看是否成功进入到了chenliang库
    mysql> use chenliang;
    Database changed
    
    mysql> select database();
    +------------+
    | database() |
    +------------+
    | chenliang  |
    +------------+
    1 row in set (0.00 sec)

    测试1【加unsigned参数】

    -- 创建test1测试表(这里指定了UNSIGNED,也就是无符号)
    mysql> CREATE TABLE IF NOT EXISTS test1(
        -> id smallint(5) UNSIGNED
        -> );
    Query OK, 0 rows affected (0.03 sec)
    ^==test1表的id字段指定了unsigned参数,那么id字段的范围就是0~65535
    
    mysql> desc test1;
    +-------+----------------------+------+-----+---------+-------+
    | Field | Type                 | Null | Key | Default | Extra |
    +-------+----------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned | YES  |     | NULL    |       |
    +-------+----------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    -- 测试01:测试插入范围0~65535的整数以及超过65535的整数
    mysql> insert into test1 values(0);     #插入整数0,正确(没有超过范围0~65535)
    Query OK, 1 row affected (0.03 sec)
    
    mysql> insert into test1 values(65535); #插入整数65535,正确(没有超过范围0~65535)
    Query OK, 1 row affected (0.03 sec)
    
    mysql> insert into test1 values(65536); #插入整数65536,错误(超过范围0~65535)
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    
    mysql> select * from test1;
    +-------+
    | id    |
    +-------+
    |      0|
    |  65535|
    +-------+
    2 rows in set (0.00 sec)
    
    -- 测试02:测试-1~-32768范围的负整数,以及小于-32768的负整数
    mysql> insert into test1 values(-1); 
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-1,报错(因为建表时,id字段加了unsigned参数,id字段的范围为0~65535
    
    mysql> INSERT INTO test1 values(-32768); 
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-32768,报错(因为建表时,id字段加了unsigned参数,id字段的范围为0~65535)
    
    mysql> insert into test1 values(-32769);
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-32769,报错(因为建表时,id字段加了unsigned参数,id字段的范围为0~65535)
    
    mysql> select * from test1;
    +-------+
    | id    |
    +-------+
    |      0|
    |  65535|
    +-------+
    2 rows in set (0.01 sec)

    测试2【加zerofill参数】

    -- 创建test2表,(这里指定了zerofill,也就是前导零填充)
    mysql> create table if not exists test2(
        -> id smallint(5) zerofill
        -> );
    Query OK, 0 rows affected (0.12 sec)
    ^==test2表的id字段指定了zerofill参数,它会把unsigned参数也带上,那么id字段的范围就是0~65535
    
    mysql> desc test2;
    +-------+-------------------------------+------+-----+---------+-------+
    | Field | Type                          | Null | Key | Default | Extra |
    +-------+-------------------------------+------+-----+---------+-------+
    | id    | smallint(5) unsigned zerofill | YES  |     | NULL    |       |
    +-------+-------------------------------+------+-----+---------+-------+
    1 row in set (0.00 sec)
    
    -- 测试01:测试插入范围0~65535的整数和超过65535的整数
    mysql> insert into test2 values(0);     #插入整数0,在0~65535范围内,正确
    Query OK, 1 row affected (0.04 sec)
    
    mysql> insert into test2 values(65535); #插入整数65535,在0~65535范围内,正确
    Query OK, 1 row affected (0.05 sec)
    
    mysql> insert into test2 values(65536); #插入整数65536,不在0~65535范围内,错误
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    
    mysql> select * from test2;
    +-------+
    | id    |
    +-------+
    | 00000 |
    | 65535 |
    +-------+
    2 rows in set (0.00 sec)
    
    -- 测试02:测试-1~-32768范围的负整数,以及小于-32768的负整数
    mysql> INSERT INTO test2 values(-1);
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-1,错误(因为在id字段加了zerofill参数,它会把unsigned也带上,所以id字段的范围为0~65535
    mysql> INSERT INTO test2 values(-32768);
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-32768,错误(因为在id字段加了zerofill参数,它会把unsigned也带上,所以id字段的范围为0~65535
    mysql> insert into test2 values(-32769);
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-32769,错误(因为在id字段加了zerofill参数,它会把unsigned也带上,所以id字段的范围为0~65535,并且有符号的范围也只是-32768~32767
    mysql
    > select * from test2; +-------+ | id | +-------+ | 00000 | | 65535 | +-------+ 2 rows in set (0.00 sec)

    测试3【不加unsigned和zerofill参数】

    -- 创建test3表(不加unsigned和zerofill)
    mysql> create table if not exists test3(
        -> id smallint(5)
        -> );
    Query OK, 0 rows affected (0.08 sec)
    ^==test3表的id字段没指定unsigned和zerofill参数,那么id字段的范围就是-32768~32767
    
    mysql> desc test3;
    +-------+-------------+------+-----+---------+-------+
    | Field | Type        | Null | Key | Default | Extra |
    +-------+-------------+------+-----+---------+-------+
    | id    | smallint(5) | YES  |     | NULL    |       |
    +-------+-------------+------+-----+---------+-------+
    1 row in set (0.01 sec)
    
    -- 测试01:测试插入整数0~32767和超过32767的整数
    mysql> insert into test3 values(0); 
    Query OK, 1 row affected (0.00 sec)
    ^==插入整数0,正确(在范围-32768~32767范围内)
    
    mysql> insert into test3 values(32767);
    Query OK, 1 row affected (0.04 sec)
    ^==插入整数32767,正确(在范围-32768~32767范围内)
    
    mysql> insert into test3 values(32768);
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入整数32768,错误(不在范围-32768~32767范围内)
    
    mysql> select * from test3;
    +-------+
    | id    |
    +-------+
    |     0 |
    | 32767 |
    +-------+
    2 rows in set (0.00 sec)
    
    -- 测试02:测试插入负数-1~-32768和小于-32768的负数
    mysql> INSERT INTO test3 values(-1);
    Query OK, 1 row affected (0.10 sec)
    ^==插入负整数-1,正确(在范围-32768~32767范围内)
    
    mysql> INSERT INTO test3 values(-32768);
    Query OK, 1 row affected (0.02 sec)
    ^==插入负整数-32768,正确(在范围-32768~32767范围内)
    
    mysql> insert into test3 values(-32769);
    ERROR 1264 (22003): Out of range value for column 'id' at row 1
    ^==插入负整数-32769,错误(不在范围-32768~32767范围内)
    mysql
    > select * from test3; +---------+ | id | +---------+ | 0 | | 32767| | -1| | -32768| +----------+ 4 rows in set (0.00 sec)

    总结

    格式:

    id       smallintM)      [UNSIGNED]  [ZEROFILL]

    字段名    字段类型(长度)     [无符号]    [前导填充]

    unsigned:

    01:smallint(M)后面加上unsigned后,就是无符号(smallint的范围就是0~65535)

    02:smallint(M)后面不加上unsigned,并且不加zerofill参数,就是有符号(smallint的范围就是-32768~32767)

    zerofill:

    01:进行前导零填充(插入数值1,表中显示的是00001,因为smallint的长度为5)

    02:smallint(M)加上zerofile后,同时也会把unsigned参数也带上(smallint的范围为0~65535)

    转载于:https://www.cnblogs.com/chenliangc/articles/11107232.html

    展开全文
  • MySql中int,smallint,mediumint与bigint 一、容纳数据范围不同 1、smallint(M) M默认为6 带符号的范围是-32768到32767;无符号的范围是0到65535。 2、mediumint(M) M默认为11 带符号的范围是-8388608到...

    MySql中 tinyint,smallint,mediumint,int 与 bigint

    一、容纳数据范围不同

    1、tinyint(M) M默认为4,存储占1个字节

    带符号的范围是-128到127。无符号的范围是0到255。

    1、smallint(M) M默认为6,存储占2个字节

    带符号的范围是-32768到32767;无符号的范围是0到65535。

    2、mediumint(M) M默认为11,存储占3个字节

    带符号的范围是-8388608到8388607;无符号的范围是0到16777215。

    3、int(M) M默认为11,存储占4个字节

    带符号的范围是-2147483648到2147483647;无符号的范围是0到4294967295。

    4、bigint(M) M默认为20,存储占8个字节

    带符号的范围是-9223372036854775808到9223372036854775807;无符号的范围是0到18446744073709551615。

    二、存储大小不同

    smallint 存储占2 个字节,int 存储占4字节,所以在考虑最大数据范围的前提下,为了节省磁盘空间,优先选用smallint类型。

     

    MySQL数据类型DECIMAL用法

    DECIMAL用法

    DECIMAL(P,D)

    • P是表示有效数字数的精度。 P范围为1〜65。默认值是10
    • D是表示小数点后的位数。 D的范围是0~30。MySQL要求D小于或等于(<=)P。默认值是0

    比如DECIMAL(6,2):表示最多可以存储6位数字,小数位数为2位,小数部分会做四舍五入。

    比如DECIMAL,等价于DECIMAL(10,0)。

    DECIMAL存储

    MySQL分别为整数和小数部分分配存储空间。 MySQL使用二进制格式存储DECIMAL值。它将9位数字包装成4个字节。

    对于每个部分,需要4个字节来存储9位数的每个倍数。剩余数字所需的存储如下表所示:

    剩余数字
    00
    1–21
    3–42
    5–63
    7-94

    例如,DECIMAL(19,9)对于小数部分具有9位数字,对于整数部分具有19位= 10位数字,小数部分需要4个字节。 整数部分对于前9位数字需要4个字节,1个剩余字节需要1个字节。DECIMAL(19,9)列总共需要9个字节。

     

     

    mysql字段类型tinyint、smallint、mediumint、int、bigint详解

    mysql建模的过程中,对于优化来讲一个非常重要的点就是字段类型的设置,好的字段类型的设置可以帮助更快的查询数据同时能节约硬盘空间,这对于优化数据库来讲是非常重要的。


    mysql的字段类型大体来讲分为int、text、varchar、char、blog等几种,而各自的类型中又划分了不同的字符数的类型,这里先来讨论几种整形的情况。


    先来看一下基本的概念:字节(byte),1个字节等于8个位(bit),一个bit存储0或者1,理解这个对于理解后面的占用字节导致的存储数值的有很重要的作用。


    整型,常见细分为tinyint、smallint、mediumint、int、bigint这几种。

    1)tinyint:存储所占一个字节,一个字节等于8bit,根据1bit可以存储0到1两种可能性,因此tinyint类型可以存储2的8次方,也就是256种可能性,从0开始计数,无符号也就是可以 存储0~255,如果是有符号,那就是-128~127。

    2)smallint:存储所占两个字节,同上也就是可以存储2的16次方,也就是可以存储65536种可能性,无符号从0开始则是可以存储0~65535,有符号则是-32768~32767。

    3)mediumint:存储所占三个字节,也就是2的24次方,可以存储16777216种可能性,无符号可以存储0~16777215,有符号可以存储-8388608~8388607。


    4)int:存储所占四个字节,也就是2的32次方,可以存储4294967296种可能性,无符号可以存储0~4294967295,有符号则是-2147483648~2147483647。


    5)bigint:存储所占8个字节,也就是2的64次方,可以存储2的64次种可能性,无符号可以存储0~((2³²×²)-1),有符号则是-(2³²×²)/2 ~ (2³²×²)/2-1。


    我们经常会见到int(11)、tinyint(1)这种后面跟括号里面放数字的情况,很多人以为这是代表的该类型可存储的长度,但是我们上面已经分析了存储的情况,这种理解肯定是不对的,实际上括号里的数字表示的是最大显示宽度,这个数字和存储大小及其类型没有任何关系,也就是说tinyint(1)和tinyint(3)都是存储一个字节,并不会因为括号里的数字改变,这个数字仅仅是显示最大宽度。


    例如tinyint(3)存储11则会显示011,因为最大宽度为3,达不到的情况下用0来补充,这样的话就很好理解了,下图也是做了一定的对比,分别存储的是1和123456、1234567890这几个数字。


    在设置这个括号里的数值时我们也要小心,因为mysql手册上明确写了:当 mysql 为某些复杂的联结(join)生成临时表时,你可能会遇到问题,因为在这种情况下,mysql 信任地认为所有的值均适合原始的列宽度!
     

     

     

     

     

     

     

     

     

     

     

    展开全文
  • tinyint 从 -2^7 (-128) 到 2^7 - 1 (123) 的整型数据。存储大小为 1 个字节。 unsigned 是从 0 到 255 的整型数据。 所以建表的时候 只能是tinyint(3),哪怕你建tinyint(100...所以建表的时候 只能是smallint(5),哪怕你

    tinyint

    从 -2^7 (-128) 到 2^7 - 1 (123) 的整型数据。存储大小为 1 个字节。

    unsigned 是从 0 到 255 的整型数据。

    所以建表的时候 只能是tinyint(3),哪怕你建tinyint(100),他最大还是3位这么多。

    smallint

    从 -2^15 (-32,768) 到 2^15 - 1 (32,767) 的整型数据。存储大小为 2 个字节。

    unsigned 是从 0 到 65535 的整型数据。

    所以建表的时候 只能是smallint(5),哪怕你建smallint(100),他最大还是5位这么多。

    int

    从 -2^31 (-2,147,483,648) 到 2^31 - 1 (2,147,483,647) 的整型数据(所有数字).存储大小为 4 个字节。

    unsigned 是从 0 到 4294967296 的整型数据。

    所以建表的时候 只能是int(10),哪怕你建int(100),他最大还是10位这么多。

    bigint

    从 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807) 的整型数据(所有数字)。存储大小为 8 个字节。

    unsigned 是(自己算吧)

    所以建表的时候 只能是bigint(20),哪怕你建bigint(100),他最大还是20位这么多.

    注意:

    mysql提供了五种整型: tinyint、smallint、mediumint、int和bigint。int为integer的缩写。这些类型在可表示的取值范围上是不同的。 整数列可定义为unsigned从而禁用负值;这使列的取值范围为0以上。各种类型的存储量需求也是不同的。取值范围较大的类型所需的存储量较大。

    mysql 提供三种浮点类型: float、double和decimal。与整型不同,浮点类型不能是unsigned的,其取值范围也与整型不同,这种不同不仅在于这些类型有最大 值,而且还有最小非零值。最小值提供了相应类型精度的一种度量,这对于记录科学数据来说是非常重要的(当然,也有负的最大和最小值)。

    展开全文
  • 1、int、bigint、smallint 和 tinyint的区别 1 bytes = 8 bit ,一个字节最多可以代表的数据长度是2的8次方 11111111 在计算机中也就是 -128到127 1.BIT[M] 位字段类型,M表示每个值的位数,范围从1到64,如果M被...
  • tinyint 从 -2^7 (-128) 到 2^7 - 1 (123) 的整型数据。存储大小为 1 个字节。 unsigned 是从 0 到 255 的整型数据。 所以建表的时候 只能是tinyint(3),哪怕你建tinyint(100...所以建表的时候 只能是smallint(5),哪怕你
  • 重载SmallInt

    2021-04-29 14:30:26
    设计一个简单的SmallInt类,用来表示从-128到127之间的整数。类的唯一的数据成员val存放一个-128到127(包含-128和127这两个数)之间的整数。根据给定的main函数设计必要的成员函数。main函数已给定,提交时只需要...
  • CREATE OR REPLACE FUNCTION boolean_to_smallint(b boolean) RETURNS smallint AS $$ BEGIN RETURN (b::boolean)::bool::int; END; $$LANGUAGE plpgsql; CREATE CAST (boolean AS smallint) WITH FUNCTION ...
  • 这些类型包括严格数值数据类型(INTEGER、SMALLINT、DECIMAL和NUMERIC),以及近似数值数据类型(FLOAT、REAL和DOUBLE PRECISION)。 关键字INT是INTEGER的同义词,关键字DEC是DECIMAL的同义词。 BIT数据类型保存位...
  • postgresql smallint / integer out of range

    千次阅读 2018-08-23 15:47:36
    解析: :: 的优先级比 - 高。
  • 1、bigint:从-2^63(-9223372036854775808)到2^63-1(9223372036854775807)...3、smallint:从-2^15(-32768)到2^15-1(32767)的整型数据。存储大小为2个字节。 4、tinyint:从0到255的整型数据。存储大小为1个字节。 ...
  • 最近使用mysql数据库的时候遇到了多种数字的类型,主要有int,bigint,smallint和tinyint。其中比较迷惑的是int和smallint的差别。今天就在网上仔细找了找,找到如下内容,留档做个总结: 类型 占用字节 tinyint 1 ...
  • bigint已经有长度了,在mysql建表中的length,只是用于显示的位数 smallint 从 -2^15 (-32,768) 到 2^15 – 1 (32,767) 的整型数据。存储大小为 2 个字节。 tinyint 从 0 到 255 的整型数据。存储大小为 1 字节...
  • 1.int(M) M默认为11 ...2.smallint(M) M默认为6 带符号的范围是-32768到32767;无符号的范围是0到65535。 3.mediumint(M) M默认为11 带符号的范围是-2147483648到2147483647;无符号的范围是0到4294967295。...
  • 问题背景 代码中写的是通用的,报错后发现,like的时候里面的值实际上是整型,但代码中以string拼接的,所以实际上postgre查询的时候是用整型的列和字符串型参数执行了sql,报出来这个错。 即 columnLIKE '%0%' ...
  • 前言 每种编程语言都有自己所定义的数据类型,mysql也不例外,平时我们在创建表时,需要根据业务要求,结合存储、索引、字段临界值等条件来为字段定制不一样的...tinyint,smallint,mediumint,int,bigint tinyi...
  • 今天我遇到一个奇怪的错误,实际上我的公司计划将现有的j2ee Web应用程序从PostgreSQL 8.2迁移到最新的PostgreSQL 8.3。...org.postgresql.util.PSQLException: ERROR: operator does not exist: smallint ...
  • 因为数据库一开始用的mysql 现在改成postgresql,数据迁移或多或少出现问题, 想把postgre的int2类型改为bool(布尔)类型报错。那就只能换种方式了。 语句解释: ALTER TABLE 表名 ALTER COLUMN 字段名 TYPE 需要转换...
  • MySQL支持SQL标准整数类型INTEGER(或INT)和SMALLINT。作为对该标准的扩展,MySQL还支持整数类型TINYINT,MEDIUMINT和BIGINT。它们具有不同的存储大小和可接受值的范围。 接下来是图表 Type Storage (Bytes) ...
  • SQLSERVER 数据类型int、bigint、smallint 和 tinyint范围 【bigint】 从 -2^63 (-9223372036854775808) 到 2^63-1 (9223372036854775807) 的整型数据(所有数字)。存储大小为 8 个字节。 【int】 从 -2^31 (-2...
  • 想要了解取值范围首先需要知道的是 bit 和 Byte 的概念 bit :位 二进制数系统中,位通常简写为 "b",也称为比特,每个二进制数字 0 或 1 就是一个位(bit)。位是表示信息的最小单位,其中 8 bit 就称为一个...
  • sql server数据库中 smallint, int ,bigint ,tinyint的区别与长度 smallint 是一种精确的数值数据类型,其精度在算术运算后不变,采用2个字节编码 有符号的 smallint 值的范围是 -2^15-------2^15 -1,即 -32768...
  • SQL数据类型 bigint、int、mediumint、smallint、tinyint 取值范围: 1、tinyint,一位大小为 1 字节。 -27 (-128) 到 27 - 1 (127)的整型数据 无符号的范围:0 到 255 2、smallint,一位大小为 2 个字节 -215 (-32,...
  • 整数型数据包括bigint型、int型、bit、smallint型和tinyint型。 bigint型数据的存储大小为8个字节,共64位。其中63位用于表示数值的大小,1位用于表示符号。bigint型数据可以存储的数值范围是-263~263-1,即 -9 ...
  • 整数型数据包括bigint型、int型、smallint型和tinyint型 bigint型数据的存储大小为8个字节,共64位。其中63位用于表示数值的大小,1位用于表示符号。bigint型数据可以存储的数值范围是-263~263-1,即 -9 223 372...
  • 数据库设计——smallint(5) VS varchar(5)

    千次阅读 2018-05-23 14:50:27
    背景很简单,同事调用我方创建账单接口,创建失败,查日志显示Data truncation: Out of range value for column 'channel' at row 1明显,对方传入的channel字段超过了smallint的最大值。(业务上该值不会超过...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,819
精华内容 27,927
关键字:

smallint