• MySQL中UNSIGNED和ZEROFILL的介绍


    UNSIGNED:

    将数字类型无符号化,这与C和C++这些程序语言的unsigned含义相同。

    INT的类型范围-2 147 483 648~2 147 483 647

    INT UNSIGNED范围0~4 294 967 295

    看起来是个不错的属性选项,特别是对于主键自增长的类型,因为一般来说,用户都希望主键是非负数,然而,在实际使用中,UNSIGNED可能会带来一些负面的影响。

    示例

    CREATE TABLE t(a INT UNSIGNED,b INT UNSIGNED);
    
    INSERT INTO t SELECT 1,2;
    
    SELECT * FROM t;
    
         a       b 
    
    ------  --------
    
         1         2

    我们创建了一个表t,存储引擎为InnoDB,表t 上有两个UNSIGNED的INT类型,输入(1,2)这一行的数据,目前看来是没有问题的,运行如下语句

    SELECT a-b FROM t;

    会报错

    BIGINT UNSIGNED value is out of range in '(`iot2`.`t`.`a` - `iot2`.`t`.`b`)'
    

      

    要怎么才能获得-1这个数呢,只需要将SQL_MODE这个参数进行设置即可

    SET sql_mode='NO_UNSIGNED_SUBTRACTION';
    
    SELECT a-b FROM t;
    
       a-b 
    
    --------
    
          -1

    个人看法是尽量不要使用UNSIGNED,因为可能会带来一些意想不到的的效果,对于INT类型可能存放不了的数据,INT UNSIGNED同样可能存放不了,与其如此,还不如在数据库设计阶段将INT类型提升为BIGINT类型

    ZEROFILL:

    通过t表来表述

    Table   Create Table                                                                                                                      
    
    ------  ----------------------------------------------------------------------------------------------------------------------------------
    
    t       CREATE TABLE `t` (                                                                                                                
    
              `a` int(10) unsigned DEFAULT NULL,                                                                                             
    
              `b` int(10) unsigned DEFAULT NULL                                                                                               
    
            ) ENGINE=InnoDB DEFAULT CHARSET=utf8      
    

      

                                                                                           

    可以看到int(10),如果没有ZEROFILL这个属性,括号内int(10)这个10的数字是毫无意义

    但是对列添加ZEROFILL属性后,结果就有所不同

    ALTER TABLE t CHANGE COLUMN a  a INT(4) UNSIGNED ZEROFILL;

    这里对a列进行了修改,为其添加了ZEROFILL属性,并且将默认的int(10)改成int(4),在进行查找,返回的结果是

         a       b 
    
    ------  --------
    
      0001         2

    这是可以看到a的值由原来的1变为0001,这就是ZEROFILL属性的作用,如果宽度小于设定的宽度(这里宽度为4),则自动填充0,需要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1

    SELECT a,HEX(a) FROM t;
    
         a  hex(a) 
    
    ------  --------
    
      0001  1      

    可以看到数据库内部存储还是1,0001只是设置了ZEROFILL属性的一种格式化输出而已。

     

  • 相关阅读:
    我的第二个裸板程序之链接地址与存储地址
    ARM你必须知道的事儿——为啥“PC = PC + 8”?
    typedef你真的理解么?
    centos使用--vsftpd配置
    centos使用--zsh
    laravel5.2总结--序列化
    laravel5.2总结--csrf保护
    laravel5.2总结--任务调度
    laravel5.2总结--本地化以及常量的使用
    laravel5.2总结--文件上传
  • 原文地址:https://www.cnblogs.com/olinux/p/5180543.html
Copyright © 2020-2023  润新知