一、int和tinyint的區別
大小:
tinyint在mysql中占用1個字節 即:
1 bytes = 8 bit ,一個字節最多可以代表的數據長度是2的8次方:11111111 = 256
在計算機中也就是 -128到127
int在占用4個字節,即:2的32次方 = 4 294 967 296
在計算機中也就是 -2147483646到2147483647
bigint在占用4個字節,即:2的64次方
另:tinyint(1) 對應的是java的boolean
二、varchar和char的區別
char是一種固定長度的類型,varchar則是一種可變長度的類型,它們的區別是: char(M)類型的數據列里,每個值都占用M個字節,如果某個長度小於M,MySQL就會在它的右邊用空格字符補足.(在檢索操作中那些填補出來的空格字符將被去掉)在varchar(M)類型的數據列里,每個值只占用剛好夠用的字節再加上一個用來記錄其長度的字節(即總長度為L+1字節).
在MySQL中用來判斷是否需要進行對據列類型轉換的規則
1、在一個數據表里,如果每一個數據列的長度都是固定的,那么每一個數據行的長度也將是固定的.
2、只要數據表里有一個數據列的長度的可變的,那么各數據行的長度都是可變的.
3、如果某個數據表里的數據行的長度是可變的,那么,為了節約存儲空間,MySQL會把這個數據表里的固定長度類型的數據列轉換為相應的可變長度類型.例外:長度小於4個字符的char數據列不會被轉換varchar類型
在mysql中,char和varchar都表示字符串類型.但他們存儲和檢索數據的方式並不相同.
在表結構定義中聲明char和varchar類型時,必須指定字符串的長度.也就是該列所能存儲多少個字符(不是字節,是字符).例如:char(10)和varchar(10)都能存儲10個字符.
聲明為char的列長度是固定的,char的長度可選范圍在0-255之間.也就是char最大能存儲255個字符.如果該列是utf8編碼,則該列所占用的字節數=字符數*3.如果是gbk編碼則該列所占用的字節數=字符數*2.
聲明為varchar的列長度是可變的,在mysql5.0.3之前varchar的長度范圍為0-255,mysql5.0.3之后varchar的長度范圍為0-65535個字節.采用varchar類型存儲數據需要1-2個字節(長度超過255時需要2個字節)來存儲字符串的實際長度.如果該列的編碼為gbk,每個字符最多占用2個字節,最大長度不能超過32766個字符.如果該列的編碼為utf8,每個字符最多占3個字節,最大字符長度為21845.
總結:
① char和varchar最大的不同就是一個是固定長度,一個是可變長度.由於是可變長度,因此存儲的是實際字符串再加上一個記錄字符串長度的字節。如果分配給char或varchar列的值超過 列的最大長度,則對值進行裁剪.
②varchar(M)和char(M),M都表示字符數.varchar的最大長度為65535個字節,不同的編碼所對應的最大可存儲的字符數不同.char最多可以存放255個字符,不同的編碼最大可用字節數不同.
三、Date,DateTime,TimeStamp和Time的解釋和區別
timestamp與datetime的區別
a)DATETIME的默認值為null;TIMESTAMP的字段默認不為空(not null),默認值為當前時間(CURRENT_TIMESTAMP),如果不做特殊處理,並且update語句中沒有指定該列的更新值,則默認更新為當前時間。
這個區別就解釋了為什么平時我們都不用可以管這個字段就能自動更新了,因為多數時候用的是timestamp;而此處用的是datetime,不會有自動更新當前時間的機制,所以需要在上層手動更新該字段
b)DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間為4字節。因此,TIMESTAMP比DATETIME的空間利用率更高。
這個區別解釋了為啥timestamp類型用的多
c)兩者的存儲方式不一樣 ,對於TIMESTAMP,它把客戶端插入的時間從當前時區轉化為UTC(世界標准時間)進行存儲。查詢時,將其又轉化為客戶端當前時區進行返回。而對於DATETIME,不做任何改變,基本上是原樣輸入和輸出。
d)兩者所能存儲的時間范圍不一樣
timestamp所能存儲的時間范圍為:’1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’;
datetime所能存儲的時間范圍為:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。
CURRENT_TIMESTAMP為什么能用於datetime類型
在mysql 5.6之前的版本,CURRENT_TIMESTAMP只能用於timestamp類型,
5.6版本之后,CURRENT_TIMESTAMP也能用於datetime類型了
select version()查了一下數據庫發現確實版本是5.6.29
參看 https://blog.csdn.net/qq_28483283/article/details/81873054