zoukankan      html  css  js  c++  java
  • MySQL 字段类型总结

    TINYINT

      -128 - 127

      TINYINT UNSIGNED

      0 - 255

      SMALLINT

      -32768 - 32767

      SMALLINT UNSIGNED

      0 - 65535

      MEDIUMINT

      -8388608 - 8388607

      MEDIUMINT UNSIGNED

      0 - 16777215

      INT 或 INTEGER

      -2147483648 - 2147483647

      INT UNSIGNED 或 INTEGER UNSIGNED

      0 - 4294967295

      BIGINT

      -9223372036854775808 - 9223372036854775807

      BIGINT UNSIGNED

      0 - 18446744073709551615

      FLOAT

      -3.402823466E+38 - -1.175494351E-38

      0

      1.175494351E-38 - 3.402823466E+38

      DOUBLE 或 DOUBLE PRECISION 或 REAL

      -1.7976931348623157E+308 - -2.2250738585072014E-308

      0

      2.2250738585072014E-308 - 1.7976931348623157E+308

      DECIMAL[(M,[D])] 或 NUMERIC(M,D)

      由M(整个数字的长度,包括小数点,小数点左边的位数,小数点右边的位数,但不包括负号)和D(小数点右边的位数)来决定,M缺省为10,D缺省为0

      DATE

      1000-01-01 - 9999-12-31

      DATETIME

      1000-01-01 00:00:00 - 9999-12-31 23:59:59

      TIMESTAMP

      1970-01-01 00:00:00 - 2037年的某天(具体是哪天我也不知道,呵呵)

      TIME

      -838:59:59' to 838:59:59

      YEAR[(2|4)]

      缺省为4位格式,4位格式取值范围为1901 - 2155,0000,2位格式取值范围为70-69(1970-2069)

      CHAR(M) [BINARY] 或 NCHAR(M) [BINARY]

      M的范围为1 - 255,如果没有BINARY项,则不分大小写,NCHAR表示使用缺省的字符集.在数据库中以空格补足,但在取出来时末尾的空格将自动去掉.

      [NATIONAL] VARCHAR(M) [BINARY]

      M的范围为1 - 255.在数据库中末尾的空格将自动去掉.

      TINYBLOB 或 TINYTEXT

      255(2^8-1)个字符

      BLOB 或 TEXT

      65535(2^16-1)个字符

      MEDIUMBLOB 或 MEDIUMTEXT

      16777215 (2^24-1)个字符

      LONGBLOB 或 LONGTEXT

      4294967295 (2^32-1)个字符

      ENUM('value1','value2',...)

      可以总共有65535个不同的值

      SET('value1','value2',...)

     

     

     

    -------------------------------------------------------------------

     

    让 MySQL 的 TimeStamp 列不要自动更新

     

    MySQL 有一种 timestamp 列类型,可以自动为该列插入当前时间戳,当 Update 语句执行时,该时间戳也会自动更新。但有的时候,并不希望在更新时该值也自动更新,那该怎么办呢?

    其实也很简单,timestamp 自身支持这种设置。

    当建立 timestamp 列时,一般的语句为:

    create table tablename ( datecolname timestamp not null , ……..)

    其实该语句的完整语句为:

    create table tablename (datecolname timestamp not null default current_timestamp on update current_timetamp, ……..)

    如果你想让行值发生变化时时间戳不要自动更新,可以使用以下语句:

    create table tablename(datecolname timestamp not null default current_timestamp, ……..)

    问题的关键就在于有 default current_timestamp 语句而没有 on update current_timestamp 语句。

    在 MySQL Query Browser 中建立表结构时,如果不想让 timestamp 自动更新,记得一定要手动输入 default 为 current_timestamp ,这样 MySQL Query Browser 就会自动生成合适的 SQL 语句来建立表结构了。

     

     

    ------------------------------------------------

     

    mysql TIMESTAMP列类型详解

     

    mysql目前不支持列的default 为函数的形式,
    如达到你某列的默认值为当前更新日期与时间的功能,
    你可以使用timestamp列类型
    下面就详细说明timestamp列类型



    timestamp列类型
    timestamp值可以从1970的某时的开始一直到2037年,精度为一秒,其值作为数字显示。
    timestamp值显示尺寸的格式如下表所示:

    +---------------+----------------+
    | 列类型        | 显示格式       |
    | timestamp(14) | yyyymmddhhmmss | 
    | timestamp(12) | yymmddhhmmss   |
    | timestamp(10) | yymmddhhmm     |
    | timestamp(8)  | yyyymmdd       |
    | timestamp(6)  | yymmdd         |
    | timestamp(4)  | yymm           |
    | timestamp(2)  | yy             |
    +---------------+----------------+
    “完整”timestamp格式是14位,但timestamp列也可以用更短的显示尺寸创造
    最常见的显示尺寸是6、8、12、和14。
    你可以在创建表时指定一个任意的显示尺寸,但是定义列长为0或比14大均会被强制定义为列长14。
    列长在从1~13范围的奇数值尺寸均被强制为下一个更大的偶数。


    列如:
    定义字段长度     强制字段长度
    timestamp(0) ->  timestamp(14)
    timestamp(15)->  timestamp(14)
    timestamp(1) ->  timestamp(2)
    timestamp(5) ->  timestamp(6)


    所有的timestamp列都有同样的存储大小,
    使用被指定的时期时间值的完整精度(14位)存储合法的值不考虑显示尺寸。
    不合法的日期,将会被强制为0存储
    这有几个含意:
        1、虽然你建表时定义了列timestamp(8),但在你进行数据插入与更新时timestamp列
               实际上保存了14位的数据(包括年月日时分秒),
               只不过在你进行查询时mysql返回给你的是8位的年月日数据。
               如果你使用alter table拓宽一个狭窄的timestamp列,以前被“隐蔽”的信息将被显示。
        2、同样,缩小一个timestamp列不会导致信息失去,除了感觉上值在显示时,较少的信息被显示出。
        3、尽管timestamp值被存储为完整精度,直接操作存储值的唯一函数是unix_timestamp();
               由于mysql返回timestamp列的列值是进过格式化后的检索的值,
               这意味着你可能不能使用某些函数来操作timestamp列(例如hour()或second()),
               除非timestamp值的相关部分被包含在格式化的值中。
               例如,一个timestamp列只有被定义为timestamp(10)以上时,timestamp列的hh部分才会被显示,
               因此在更短的timestamp值上使用hour()会产生一个不可预知的结果。
        4、不合法timestamp值被变换到适当类型的“零”值(00000000000000)。(datetime,date亦然)       


    你可以使用下列语句来验证:
    create table test ('id' int (3) unsigned auto_increment, 'date1' timestamp (8) primary key('id'));
    insert into test set id = 1;
    select * from test;
    +----+----------------+
    | id | date1          |
    +----+----------------+
    |  1 | 20021114       |
    +----+----------------+
    alter table test change 'date1' 'date1' timestamp(14);
    select * from test;
    +----+----------------+
    | id | date1          |
    +----+----------------+
    |  1 | 20021114093723 |
    +----+----------------+


     


    你可以使用timestamp列类型自动地用当前的日期和时间标记insert或update的操作。
    如果你有多个timestamp列,只有第一个自动更新。
    自动更新第一个timestamp列在下列任何条件下发生:


       1、列值没有明确地在一个insert或load data infile语句中指定。
       2、列值没有明确地在一个update语句中指定且另外一些的列改变值。
           (注意一个update设置一个列为它已经有的值,
            这将不引起timestamp列被更新,
            因为如果你设置一个列为它当前的值,mysql为了效率而忽略更改。)
       3、你明确地设定timestamp列为null.
       4、除第一个以外的timestamp列也可以设置到当前的日期和时间,只要将列设为null,或now()。



    create table test (
         'id' int (3) unsigned auto_increment,
         'date1' timestamp (14),
         'date2' timestamp (14),
          primary key('id')
          );


    insert into test (id, date1, date2) values (1, null, null);
    insert into test set id= 2;
    +----+----------------+----------------+
    | id | date1          | date2          |
    +----+----------------+----------------+
    |  1 | 20021114093723 | 20021114093723 |
    |  2 | 20021114093724 | 00000000000000 |
    +----+----------------+----------------+
    ->第一条指令因设date1、date2为null,所以date1、date2值均为当前时间
      第二条指令因没有设date1、date2列值,第一个timestamp列date1为更新为当前时间,
        而二个timestamp列date2因日期不合法而变为“00000000000000”



    update test set id= 3 where id=1;
    +----+----------------+----------------+

    Demo:

    MYSQL中TIMESTAMP类型可以设定默认值,就像其他类型一样。

    1、自动UPDATE 和INSERT 到当前的时间:

    表:

    /*DDL Information For - test.t1*/

    ---------------------------------

    Table   Create Table                                                                        

    ------  -------------------------------------------------------------------------------------

    t1      CREATE TABLE `t1` (                                                                 

              `p_c` int(11) NOT NULL,                                                           

              `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 

            ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                                              

    数据:

    1    2007-10-08 11:53:35

    2    2007-10-08 11:54:00

    insert into t1(p_c) select 3;

    update t1 set p_c = 2 where p_c = 2;

    数据:

    1    2007-10-08 11:53:35

    2    2007-10-08 12:00:37

    3    2007-10-08 12:00:37

    2、自动INSERT 到当前时间,不过不自动UPDATE。

    表:

    /*DDL Information For - test.t1*/

    ---------------------------------

    Table   Create Table                                            

    ------  ---------------------------------------------------------

    t1      CREATE TABLE `t1` (                                     

              `p_c` int(11) NOT NULL,                               

              `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP 

            ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                  

    数据:

    insert into t1(p_c) select 4;

    update t1 set p_c = 3 where p_c = 3;

    1    2007-10-08 11:53:35

    2    2007-10-08 12:00:37

    3    2007-10-08 12:00:37

    4    2007-10-08 12:05:19

    3、一个表中不能有两个字段默认值是当前时间,否则就会出错。不过其他的可以。

    表:

    /*DDL Information For - test.t1*/

    ---------------------------------

    Table   Create Table                                                  

    ------  ---------------------------------------------------------------

    t1      CREATE TABLE `t1` (                                           

              `p_c` int(11) NOT NULL,                                     

              `p_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,      

              `p_timew2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' 

            ) ENGINE=InnoDB DEFAULT CHARSET=gb2312                        

    数据:

    1    2007-10-08 11:53:35    0000-00-00 00:00:00

    2    2007-10-08 12:00:37    0000-00-00 00:00:00

    3    2007-10-08 12:00:37    0000-00-00 00:00:00

    4    2007-10-08 12:05:19    0000-00-00 00:00:00

  • 相关阅读:
    实现自动进行金额汇总
    实现模糊查询
    手电筒查询
    lov的建立
    日历 的建立
    快速创建Folder
    TAB页制作
    堆叠画布
    弹性域的开发
    注销记录的实现
  • 原文地址:https://www.cnblogs.com/webu/p/2707858.html
Copyright © 2011-2022 走看看