MySQL——數據類型、列屬性

--------------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;
相關文章
相關標籤/搜索