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

posted on 2012-09-28 23:14  浩瀚孤鸿  阅读(289)  评论(0编辑  收藏  举报