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目前不支持列的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