首先補充點了解的小知識;
select * from mysql.user #顯示出來亂了 select * from mysql.user\G #加了\G後一行一行顯示了
1、數據類型:分不一樣種類去存不一樣類型的數據
存儲引擎決定了表的類型,而表內存放的數據也要有不一樣的類型,每種數據類型都有本身的寬度,但寬度是可選的mysql
一、數字(默認是有符號的)
sql
數字又分爲:數據庫
整型:tinyint(小整型):一個字節服務器
int(整型):四個字節。注意:int的 寬度指的是顯示的寬度,與存儲無關ide
bigint(大整形):八個字節post
======================================== tinyint[(m)] [unsigned] [zerofill] 小整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -128 ~ 127 無符號:0~ 255 PS: MySQL中無布爾值,使用tinyint(1)構造。
[unsigned]參數和[zerofill]參數的應用
3.將有符號的修改成無符號的:alter table t1 modify unsigned;(注意,若是裏面有值了,
得把裏面的值清空了再修改)
4.alter table t2 modify id int(10) zerofill; 若是顯示不夠,就用zerofill填充
======================================== int[(m)][unsigned][zerofill] 整數,數據類型用於保存一些範圍的整數數值範圍: 有符號: -2147483648 ~ 2147483647 無符號:0~ 4294967295 ======================================== bigint[(m)][unsigned][zerofill] 大整數,數據類型用於保存一些範圍的整數數值範圍: 有符號:-9223372036854775808 ~ 9223372036854775807 無符號: 0~ 18446744073709551615
小數:spa
float:在位數比較短的狀況下不精準(**** 數值越大,越不許確 ****)操作系統
double:在位數比較長的狀況下不精準(**** 數值越大,越不許確 ****)3d
decimal:若是是小數,則推薦使用decimalcode
由於精準,內部原理是以字符串的形式去存
![](http://static.javashuo.com/static/loading.gif)
1 先建立一個數據庫:create datdabase test; 2 -----------驗證1:int,tinyint,bigint---- 3 create table t1(id tinyint); 4 create table t1(id int); 5 create table t1(id bigint); #若是數字比較大的時候就用bigint 6 1.若是沒有指定符號。默認的是有符號的 7 2.insert into t1(-129) #就會報錯了,由於範圍是-128~127 8 3.將有符號的修改成無符號的:alter table t1 modify unsigned;(注意,若是裏面有值了,得把裏面的值清空了再修改) 9 4.alter table t2 modify id int(10) zerofill; 若是顯示不夠,就用zerofill填充 10 5.寬度:跟存的沒有關係,指的是顯示的寬度 11 12 13 ----------驗證2:float,double------ 14 create table t3(salary float(5,2)) #5表明salary總共多寬,2表明小數點後保留2位,那麼整數部分有3位 15 insert into t3 values(3.725454); 16 insert into t3 values(-3.725454); 17 insert into t3 values(1111.725454); #像這個就會報錯了 18 insert into t3 values(111.725454); 19 20 bit類型瞭解就行了 21 bit類型:表明二進制的類型 22 ----------驗證3:bit-------- 23 create table t3(x bit); 24 insert into t3 values(0),(1); 25 insert into t3 values(0),(2)); #只能存二進制的,這樣的話就會報錯 26 select * from t3;
最後:整形類型,其實沒有必要指定顯示寬度,使用默認的就ok
二、字符、
char:簡單粗暴,不夠就用空格湊夠固定長度存放起來,浪費空間,可是存儲速度快
(犧牲空間,提升速度)
varchar(你有幾個就存幾個):精準,計算出待存放數據的長度,節省空間,存取速度慢
(犧牲速度,提升效率)
1.-----------------
create table t6(name char(4));
insert into t6 values('alexsb');
insert into t6 values('歐德博愛');
insert into abc values('艾利克斯a');
2.-------------
create table t7(x char(5),y varchar(5)); insert into t7 values('sff','aaaaa'); select char_length(x),char_length(y) from t7; 查看字符長度 set sql_mode='pad_char_to_full_length'; #打回原形 insert into t7 values('你好啊','好好好!');#utf-8裏面一個漢字表明三個字節,那'你好啊'就表明九個,
#加上兩個空格就是11個字節 select length(x),length(y) from t7; 查看字節長度
查看字符的長度
查看字節的長度
三、日期
做用:存儲用戶註冊時間,文章發佈時間,員工入職時間,出生時間,過時時間等
有下面幾種類型:
datatime:2017-09-06 10:30:22
data:2017-09-06
time:10:30:22
year:2017
timeatamp:和datatime是同樣的,就是支持的範圍datatime的大
---------------驗證4:日期類型------- create table stu( id int, name char(5), born_data date, born_year year, reg_time datetime, class_time time ); insert into stu values(1,'ao',now(),now(),now(),now()); insert into stu values(1,'xiao','2017-09-06','2017','2017-09-06 10:39:00','08:30:00'); #瞭解 insert into stu values(1,'alex','2017-09-06',2017,'2017-09-06 10:39:00','08:30:00'); insert into stu values(1,'alex','2017/09/06',2017,'2017-09-06 10:39:00','08:30:00'); 沒有-的能夠不用加引號 insert into stu values(1,'alex','20170906',2017,'20170906103900','083000'); 也能夠吧符號取了連寫
============注意啦,注意啦,注意啦=========== 1. 單獨插入時間時,須要以字符串的形式,按照對應的格式插入 2. 插入年份時,儘可能使用4位值 3. 插入兩位年份時,<=69,以20開頭,好比50, 結果2050 >=70,以19開頭,好比71,結果1971 MariaDB [db1]> create table t12(y year); MariaDB [db1]> insert into t12 values -> (50), -> (71); MariaDB [db1]> select * from t12; +------+ | y | +------+ | 2050 | | 1971 | +------+
![](http://static.javashuo.com/static/loading.gif)
1 在實際應用的不少場景中,MySQL的這兩種日期類型都可以知足咱們的須要,存儲精度都爲秒,但在某些狀況下,會展示出他們各自的優劣。下面就來總結一下兩種日期類型的區別。 2 3 1.DATETIME的日期範圍是1001——9999年,TIMESTAMP的時間範圍是1970——2038年。 4 5 2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區。在mysql服務器,操做系統以及客戶端鏈接都有時區的設置。 6 7 3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間爲4字節。所以,TIMESTAMP比DATETIME的空間利用率更高。 8 9 4.DATETIME的默認值爲null;TIMESTAMP的字段默認不爲空(not null),默認值爲當前時間(CURRENT_TIMESTAMP),若是不作特殊處理,而且update語句中沒有指定該列的更新值,則默認更新爲當前時間。
四、枚舉與集合
字段的值只能在給定範圍中選擇,如單選框,多選框
enum枚舉:規定一個範圍:這個範圍能夠有多個,可是爲該字段傳值時,只能取規定範圍內的其中一個
set集合:規定一個範圍:這個範圍能夠有多個,可是爲該字段傳值時,能夠取規定範圍內的一個或多個
enum若是你不傳值,默認是第一個值,或者爲NUll
----------枚舉和集合----------- create table stu1( id int primary key auto_increment, name char(5), sex enum('male','female'), #enum 表明枚舉類型 hobbies set('eat','play','study','coding') #set 表明集合類型 ); insert into stu1(name,sex,hobbies) values('haiyan','none','dsfdg'); select * from stu1; #若是設置了sex是枚舉類型,就的從設定的裏面選其中的一個存 insert into stu1(name,sex,hobbies) values('haiyan','female','play,study'); select * from stu1; #若是設置了hobbies是集合類型,就得從設定的裏面選其中一個或者多個值來存
沒有按照枚舉或集合規定的傳值的結果
按照枚舉或集合的規定傳值的結果