數值型數據類型主要用來存儲數字,包含的類型有:
TINYINT、SMALLINT、MEDIUMINT、 INT(INTEGER)、 BIGINT。
下面通過一個例子來查看各種類型的所占有的數據空間,注意,我使用的版本是mysql5.6.28,可以通過下面的命令來查看:
CREATE TABLE tmp1 ( x TINYINT, y SMALLINT, z MEDIUMINT, m INT, n BIGINT );
執行成功之後,便用DESC查看表結構,結果如下:
DESC tmp1;
CREATE TABLE tmp2 ( x FLOAT(5,1), y DOUBLE(5,1), z DECIMAL(5,1) );
向表中插入數據:
INSERT INTO tmp2 VALUES(5.12, 5.15, 5.123);
SHOW WARNINGS;
SELECT * FROM tmp2;
CREATE TABLE tmp3( y YEAR );
向表中插入數據:
INSERT INTO tmp3 values(2010),('2010');
INSERT INTO tmp3 values ('2166');
語句執行之後,MySQL給出了一條警告提示,使用SHOW查看錯誤信息:
SHOW WARNINGS;
SELECT * FROM tmp3;
MySQL中YEAR類型的數據的取值范圍是1901~2155.這裡的YEAR是指的YEAR(4),此外,還有YEAR(2)。對於YEAR(2),其顯示年份的范圍為1970~2070。在YEAR(2)的設置下,00~69代表2000~2069年。
向tmp3表中y字段插入2位字符串表示的YEAR值,分別為’0’、’00’、’77’和’10’,SQL語句如下:
首先刪除表中的數據:
DELETE FROM tmp3;
向表中插入數據:
INSERT INTO tmp3 values('0'),('00'),('77'),('10');
查看結果:
SELECT * FROM tmp3;
DELETE FROM tmp3;
向表中插入數據:
INSERT INTO tmp3 values(0),(78),(11);
查看結果:
SELECT * FROM tmp3;
CREATE TABLE tmp4( t TIME );
向表中插入數據:
INSERT INTO tmp4 values('10:05:05 '), ('23:23'), ('2 10:10'), ('3 02'),('10');
查看結果:
SELECT * FROM tmp4;
TIME類型占用3字節,顯示的范圍為“-838:59:59”~“838:59:59”。有人會奇怪為什麼TIME類型的時間可以大於23。因為TIME類型不僅可以用來保存一天中的時間,也可以用來保存時間間隔,同時這也解釋了為什麼TIME類型也可以存在負值。和DATETIME類型一樣,TIME類型同樣可以顯示微秒時間,但是在插入時,數據庫同樣會進行截斷操作
向表tmp4中插入值’101112’,111213,’0’,107010,SQL語句如下:
首先刪除表中的數據:
DELETE FROM tmp4;
向表中插入數據:
INSERT INTO tmp4 values('101112'),(111213),( '0');
再向表中插入數據:
INSERT INTO tmp4 values ( 107010);
show warnings;
SELECT * FROM tmp4;
DELETE FROM tmp4;
向表中插入數據:
INSERT INTO tmp4 values (CURRENT_TIME) ,(NOW());
查看結果:
SELECT * FROM tmp4;
CREATE TABLE tmp5(d DATE);
向表中插入“YYYY-MM-DD”和“YYYYMMDD”格式日期:
INSERT INTO tmp5 values('1998-08-08'),('19980808'),('20101010');
查看插入結果:
SELECT * FROM tmp5;
DATE占用3字節,可顯示的日期范圍為“1000-01-01”到“9999-12-31”。
向tmp5表中插入“YY-MM-DD”和“YYMMDD”字符串格式日期,SQL語句如下:
首先刪除表中的數據:
DELETE FROM tmp5;
向表中插入“YY-MM-DD”和“YYMMDD”格式日期:
INSERT INTO tmp5 values ('99-09-09'),( '990909'), ('000101') ,('111111');
查看插入結果:
SELECT * FROM tmp5;
如果沒有特別的條件和要求,還是在輸入時按照標准的“YYYY-MM-DD HH:MM:SS”格式來進行。
向tmp5表中插入YY-MM-DD和YYMMDD數字格式日期,SQL語句如下:
首先刪除表中的數據:
DELETE FROM tmp5;
向表中插入YY-MM-DD和YYMMDD數字格式日期:
INSERT INTO tmp5 values (99-09-09),(990909), ( 000101) ,( 111111);
查看插入結果:
SELECT * FROM tmp5;
DELETE FROM tmp5;
向表中插入系統當前日期:
INSERT INTO tmp5 values( CURRENT_DATE() ),( NOW() );
查看插入結果:
SELECT * FROM tmp5;
CREATE TABLE tmp6( dt DATETIME );
向表中插入“YYYY-MM-DD HH:MM:SS”和“YYYYMMDDHHMMSS”格式日期:
INSERT INTO tmp6 values('1998-08-08 08:08:08'),('19980808080808'),('20101010101010');
查看插入結果:
SELECT * FROM tmp6;
DATETIME占用8字節,是占用空間最多的一種日期類型。它既顯示了日期,同時也顯示了時間。其可以表達的日期范圍為“1000-01-01 00:00:00”到“9999-12-31 23:59:59”。
在MySQL 5.5版本之前(包括5.5版本),數據庫的日期類型不能精確到微秒級別,任何的微秒數值都會被數據庫截斷。
不過MySQL數據庫提供了函數MICROSECOND來提取日期中的微秒值
DELETE FROM tmp6;
向表中插入“YY-MM-DD HH:MM:SS”和“YYMMDDHHMMSS”格式日期:
INSERT INTO tmp6 values('99-09-09 09:09:09'),('990909090909'),('101010101010');
查看插入結果:
SELECT * FROM tmp6;
DELETE FROM tmp6;
向表中插入YYYYMMDDHHMMSS和YYMMDDHHMMSS數字格式日期和時間:
INSERT INTO tmp6 values(19990909090909), (101010101010);
查看插入結果:
SELECT * FROM tmp6;
DELETE FROM tmp6;
向表中插入系統當前日期:
INSERT INTO tmp6 values( NOW() );
查看插入結果:
SELECT * FROM tmp6;
CREATE TABLE tmp7( ts TIMESTAMP);
向表中插入數據:
INSERT INTO tmp7 values ('19950101010101'), ('950505050505'), ('1996-02-02 02:02:02'), ('97@03@03 03@03@03'), (121212121212), ( NOW() );
查看插入結果:
SELECT * FROM tmp7;
DELETE FROM tmp7;
向表中插入系統當前日期:
INSERT INTO tmp7 values( NOW() );
查看當前時區下日期值:
set time_zone='+10:00';
再次查看插入時的日期值:
SELECT * FROM tmp7;
type_name(fsp)
其中,type_name的類型可以是TIME、DATETIME和TIMESTAMP。fsp表示支持秒的小數部分的精度,最大為6,表示微秒(microseconds);默認為0,表示沒有小數部分,同時也是為了兼容之前版本中的TIME、DATETIME和TIMESTAMP類型。對於時間函數,如CURTIME()、SYSDATE()和UTC_TIMESTAMP()也增加了對fsp的支持,例如:
CREATE TABLE tmp8( ch CHAR(4), vch VARCHAR(4) );
輸入數據:
INSERT INTO tmp8 VALUES('ab ', 'ab ');
查詢結果:
SELECT concat('(', ch, ')'), concat('(',vch,')') FROM tmp8;
CREATE TABLE tmp9( enm ENUM('first','second','third') );
插入各個列值:
INSERT INTO tmp9 values('first'),('second') ,('third') , (NULL);
查看索引值:
SELECT enm, enm+0 FROM tmp9;
CREATE TABLE tmp10 (soc INT, level enum('excellent', 'good','bad') );
插入數據:
INSERT INTO tmp10 values(70,'good'), (90,1),(75,2),(50,3);
再次插入數據:
INSERT INTO tmp10 values (100,'best');
SELECT * FROM tmp10;
CREATE TABLE tmp11 ( s SET('a', 'b', 'c', 'd'));
插入數據:
INSERT INTO tmp11 values('a'),( 'a,b,a'),('c,a,d');
INSERT INTO tmp11 values ('a,x,b,y');
由於插入了SET列不支持的值,因此MySQL給出警告提示。
SELECT * FROM tmp11;
CREATE TABLE tmp12( b BIT(4) );
插入數據:
INSERT INTO tmp12 VALUES(2), (9), (15);
查詢插入結果:
SELECT BIN(b+0) FROM tmp12;
CREATE TABLE tmp13( b binary(3), vb varbinary(30) );
插入數據:
INSERT INTO tmp13 VALUES(5,5);
查看兩個字段存儲數據的長度:
SELECT length(b), length(vb) FROM tmp13;
SELECT b,vb,b = '5', b='5\0\0',vb='5',vb = '5\0\0' FROM tmp13;
由執行結果可以看出,b字段和vb字段的長度是截然不同的,因為b字段不足的空間填充了’\0’,而vb字段則沒有填充。