--------------MySQL數據類型——值類型------------------- --tinyint-佔用1字節-範圍:-128~127(-2^7~2^7-1)---無符號數範圍:0~255 --smallint-佔用2字節-範圍:-32768~32767(-2^15~2^15-1) --mediumint-佔用3字節 --int--佔用4字節 --bigint--佔用8字節 create database if not exists day2 charset=utf8; use day2; --zerofill --定義整型顯示寬度 --結合zerofill則位數不夠時填充0,位數超出按原值顯示 --添加zerofill屬性後隨之產生unsigned屬性,因此不能寫入負數 create table `zerofill`( num1 int(5), num2 int(5) zerofill )engine=innodb; --num2沒有5位填充0-->00098 insert into `zerofill` values (98,98); --位數超出按原值顯示 insert into `zerofill` values (1234567,1234567); --負數不能寫入num2,會報錯 insert into `zerofill` values (-98,-98); select * from `zerofill`; --unsigned --無符號整型 --使用unsigned無符號整型範圍比有符號數大兩倍 create table `unsigned`( num1 tinyint, num2 tinyint unsigned ); --tinyint:-128~127 --tinyint unsigned:0~255 --128超出num1範圍會報錯 insert into `unsigned` values (128,128); ---128爲負數,不能寫入num2,會報錯 insert into `unsigned` values (-128,-128); --OK insert into `unsigned` values (127,255); --float,double --浮點型 --float(M,D),M指定總位數,D指定小數位數 --整數位數不能超出M-D,小數位數能夠超出D,超出則四捨五入 --支持科學計數法 --浮點型老是存儲近似值 create table `float`( num1 float, num2 double(4,2) ); --浮點數存儲的是近似值,num1的存儲值爲1 insert into `float` (num1) values (0.9999999); --若是小數位數超過,則四捨五入取兩位小數 insert into `float` (num2) values (0.1289); --若是整數位超過則不能寫入,會報錯 insert into `float` (num2) values (12345); --浮點數支持科學計數法 insert into `float` (num1) values (5E6),(7e-3); --decimal --定點數 --decimal(M,D),M指定總位數,D指定小數位數 --M:1~65,D:0~30,M>D --定點數支持無符號數,同時支持顯示寬度 create table `decimal`( num1 decimal(5,2), num2 decimal(5,2) unsigned zerofill, num3 decimal zerofill, num4 decimal )engine=innodb; --整數部分位數不能超過規定長度 insert into `decimal` (num1) values (12345); --小數部分位數超過四捨五入 insert into `decimal` (num1) values (.9876); --能夠寫入負數 insert into `decimal` (num1) values (-1); --小數和整數部分都會補齊0-->001.10 insert into `decimal` (num2) values (1.1); insert into `decimal` (num2) values (0); --定義了zerofill則會自動添加unsigned屬性,因此不能寫入負數 insert into `decimal` (num3) values (-2); --若M和D省略,則默認是decimal(10,0) insert into `decimal` (num3) values (0); --因爲默認是decimal(10,0),因此整數不能超過10位 insert into `decimal` (num4) values (12345678987654321); --寫入負數會四捨五入成整數 insert into `decimal` (num4) values (0.9876); insert into `decimal` (num4) values (0.1); ----------------------MySQL數據類型——字符類型------------------ --char-定長-長度:255個字符-效率高 --varchar-可變長度-長度:65535個字符-省空間 --tinytext-長度:2^8-1-255個字符 --text-2^16-1-65535個字符 --mediumtext-2^24-1個字符 --longtext--2^32-1個字符 --在utf8下一個中文佔3個字節,在gbk下,一箇中文佔兩個字節 --建立utf8編碼格式的表,varchar最大取值21845,考慮到從0開始,即varchar(21844) --不能建立表,報錯 create table `varchar-utf8`( char1 varchar(65535) )charset=utf8; --能夠建立表 create table `varchar-utf8`( char1 varchar(21844) )charset=utf8; --建立gbk編碼格式的表,varchar最大取值32767,考慮到從0開始,即varchar(32766) --不能建立表,報錯 create table `varchar-gbk`( char1 varchar(65535) )charset=gbk; --能夠建立表 create table `varchar-gbk`( char1 varchar(32766) )charset=gbk; --------------------MySQL數據類型——枚舉enum----------- --enum --從集合中選擇一個值做爲數據,稱爲枚舉(單選) --枚舉值在數據庫中的管理是經過整型數字管理的,第一個值是1,第二個值是2,以此類推… --枚舉佔用2個字節 --2個字節16位,能保存2^16個狀態,範圍:0~65535,枚舉從1開始,0保存的是空字符串錯誤值 --NULL值的索引是NULL create table `enum` ( sex enum('男','女','保密') ); --插入的值只能是枚舉中的值 --不能插入 insert into `enum` values ('不知道'); --能夠插入 insert into `enum` values ('男'); --能夠以整型數字形式插入 insert into `enum` values(2); --枚舉的查詢也能夠經過數字形式查詢 select * from `enum` where sex=1; --結果與sex=1同樣 select * from `enum` where sex='男'; --枚舉在數據庫內部用數字表示 select sex+0 from `enum`; -------------MySQL數據類型——集合類型(set)-------- --set --從集合中選擇一些值做爲多選數據 --數據存儲時按定義時的順序存儲,插入順序不影響顯示順序 --集合和枚舉同樣,給每一個元素分配了一個固定的值,分配方式從前日後分別是2的0次方,2的1次方,2的2次方,… --選擇多個選項,是按位或的關係,選中則該位的值爲1,不選值爲0 --集合佔8個字節 --由於集合是一個位表示一個狀態。8個字節有64個位,因此集合有64個選項 --示例:若是選擇登山、看電影和游泳,則MySQL返回的值是二進制(從右往左)1101,即十進制的9 --登山 讀書 看電影 游泳 --1 0 1 1 create table `set` ( hobby set('登山','讀書','看電影','游泳') ); --如下都顯示」讀書,登山「,MySQL內的值爲3 insert into `set` values ('登山,讀書'); insert into `set` values ('讀書,登山'); --插入兩行記錄,MySQL內的值爲二進制1001,即十進制9 insert into `set` values ('讀書'),('游泳'); --MySQL內的值爲1111-->15 insert into `set` values ('登山,讀書,看電影,游泳'); --集合在MySQL內部是經過數字管理的 select hobby+0 from `set`; ------------------MySQL數據類型——日期時間型------------- --date,日期 --time,時間 --datetime,日期時間 --year,年份,佔用1個字節 --timestamp,時間戳,佔用4個字節,從1970年1月1日0時0分0秒到如今的秒數 --datetime --範圍:1~9999 create table `datetime`( myDate datetime ); --正常值 insert into `datetime` values ('2015-11-15 1:08:30'); --位數不夠會用0補齊-->2015-01-01 01:01:01 insert into `datetime` values ('2015-1-1 1:1:1'); --若是年份沒有寫夠四位,則會按最接近的合理年份補齊 --MySQL儲存爲:2015-11-15 1:08:30 insert into `datetime` values ('15-11-15 1:08:30'); --MySQL儲存爲:1999-11-15 1:08:30 insert into `datetime` values ('99-11-15 1:08:30'); --MySQL儲存爲:999-11-15 1:08:30 insert into `datetime` values ('999-11-15 1:08:30'); --因此,最好在插入值的時候年份寫滿4位,避免錯誤 insert into `datetime` values ('0099-11-15 1:08:30'); --插入的值必須符合規範,如下報錯 insert into `datetime` values ('2015-99-99 99:99:99'); --time --能夠表示時間,也能夠用來表示時間間隔 --範圍:-838:59:59~838:59:59 create table `time`( myTime time ); --插入時間 insert into `time` values ('22:2:2'); --時間間隔 insert into `time` values ('222:22:22'); insert into `time` values ('-222:22:22'); --time也支持以天的方式表示時間間隔,但儲存和顯示時會轉化成小時數 insert into `time` values ('10 10:10:10'); --timestamp --timestamp和datetime表現形式是同樣的 --他們的區別在於datetime帶範圍是1~9999 --而timestamp的範圍是1970年~2038年01月19日11:14:07秒 --到了這個秒數就超過了4個字節的大小了 create table `timestamp`( myTime timestamp ); --插入數據 insert into `timestamp` values ('2015-1-1 1:1:1'); --year --只能表示從1901~2155之間的年份,由於只佔用一個字節,只能表示255個年份 --------------------MySQL數據類型——布爾型--------------- --boolean --mysql不支持boolean型,true和false在數據庫中對應1和0 --布爾型在計算機內部用tinyint來保存 create table `boolean` ( myBool boolean ); --插入值 insert into `boolean` values (true),(false); insert into `boolean` values (1),(0); --這樣居然也行 insert into `boolean` values (8),(0); ------------------列屬性——是否爲空(null|not null)--------- --null|not null create table `null` ( num1 int null, num2 int not null ); --插入數據 insert into `null` values (null,89); -----------------列屬性——默認值(default)------------- --default --若是一個字段沒有插入值,能夠默認插入一個指定的值 --插入默認值不能使用null,而是使用default關鍵字 create table `default` ( age int default 10, addr varchar(50) default '地址不詳' ); --插入數據 insert into `default` values (default,default); insert into `default` (age) values (89); insert into `default` (addr) values ('上海'); -----------------列屬性——自動增加(auto_increment)------------- --auto_increment --字段的值從1開始,每次遞增1 --由於自動增加確定是正整數,因此能夠設定成無符號整型 --自動增加的特色就是字段中不會有重複的值,適合爲記錄生成一個惟一的id號 --自動增加列的編號一旦刪除,默認就不會重複使用 create table `auto_increment` ( id int unsigned auto_increment primary key, name varchar(50) ); -----------------列屬性——主鍵(primary key)------------- --primary key --惟一標識表中的一個或一組列成爲主鍵 --一個表只有一個主鍵,可是一個主鍵能夠由多個字段組成 --在字段後面經過primary key關鍵字建立主鍵 create table `primary key` ( id int unsigned auto_increment primary key, name varchar(50) ); --經過primary key()方法建立 create table `primary key` ( id int unsigned auto_increment, name varchar(50), primary key(id) ); --經過修改表的方式建立主鍵 create table `primary key` ( id int unsigned auto_increment primary key, name varchar(50) ); alter table `primary key` add primary key(id); --建立組合鍵 create table `primary key` ( id int unsigned auto_increment, name varchar(50), primary key(id,name) ); --刪除主鍵 alter table `primary key` drop primary key;