數字
整數類型:整型的長度約束,實際上沒有效果
tinyinit
有負號(默認): -128 ~ 127 超過報錯(可以調整sql_mode,讓其不報錯)
create table 表名(字段名 tinyint);
insert into t1 values (-128);
無符號: 0-255 超過報錯(可以調整sql_mode,讓其不報錯)
create table 表名(字段名 tinyint unsigned);
int
有符號(負號): -2147483648 ~ 2147483647 超過報錯(可以調整sql_mode,讓其不報錯)
create table 表名(字段名 int);
無符號: 0 ~ 4294967295 超過報錯(可以調整sql_mode,讓其不報錯)
create table 表名(字段名 int unsigned);
bigint
有符號: -9223372036854775808 ~ 9223372036854775807 超過報錯(可以調整sql_mode,讓其不報錯)
create table 表名(字段名 bigint);
無符號: 0 ~ 18446744073709551615 超過報錯(可以調整sql_mode,讓其不報錯)
create table 表名(字段名 bigint unsigned);
浮點型:
decimal: 推薦使用,准確的小數值,m最大值為65位(包含d的位數),d最大值為30位小數
create table 表名(字段名 decimal(65,30));
insert into t1 values(1.1111111111111111111111111111111);
float: 隨着小數的增多,精度變得不准確,m最大值為256位(包含d的位數),d最大值為30位小數
有符號: -3.402823466E+38 ~ -1.175494351E-38,1.175494351E-38 ~ 3.402823466E+38
create table 表名(字段名 floact(m,d))
無符號:
1.175494351E-38 ~ 3.402823466E+38
double: 隨着小數的增多,精度比float要高,但也會變得不准確,m最大值為256位(包含d的位數),d最大值為30位小數
有符號: -1.7976931348623157E+308 ~ -2.2250738585072014E-308,2.2250738585072014E-308 ~ 1.7976931348623157E+308
create table 表名(字段名 double(m,d));
無符號: 2.2250738585072014E-308 ~ 1.7976931348623157E+308
字符串:
char(10): 簡單粗暴,浪費空間(字符字符串不足10個也存儲10個),存取速度快,字符長度范圍: 0-255(一個中文是一個字符,是utf8編碼的3個字節)
檢索: 在檢索或者說查詢時,查出的結果會自動刪除尾部的空格,如果你想看到它補全空格之后的內容,除非我們打開pad_char_to_full_length SQL模式(SET sql_mode = 'strict_trans_tables,PAD_CHAR_TO_FULL_LENGTH';)
varchar: 准確,節省空間,存取速度慢, 字符長度范圍: 0-65535(如果大於21845會提示用其他類型 mysql行最大限制為65535字節,字符編碼為utf-8
存儲: varchar類型存儲數據的真實內容,不會用空格填充,如果'ab ',尾部的空格也會被存起來
強調:varchar類型會在真實數據前加1-2Bytes的前綴,該前綴用來表示真實數據的bytes字節數(1-2Bytes最大表示65535個數字,正好符合mysql對row的最大字節限制,即已經足夠使用)
如果真實的數據<255bytes則需要1Bytes的前綴(1Bytes=8bit 2**8最大表示的數字為255)
如果真實的數據>255bytes則需要2Bytes的前綴(2Bytes=16bit 2**16最大表示的數字為65535)
檢索: 尾部有空格會保存下來,在檢索或者說查詢時,也會正常顯示包含空格在內的內容
length(字段):查看該字段數據的字節長度
char_length(字段):查看該字段數據的字符長度
BINARY 和 VARBINARY 類似於 CHAR 和 VARCHAR,不同的是它們包含二進制字符串而不要非二進制字符串.也就是說,它們包含字節字符串而不是字符字符串,這說明它們沒有字符集,並且排序和比較基於列值字節的數值值。
BLOB 是一個二進制大對象,可以容納可變數量的數據.有 4 種BLOB類型: TINYBLOB、BLOB、MEDIUMBLOB 和 LONGBLOB.它們區別在於可容納存儲范圍不同.
有 4 種 TEXT 類型: TINYTEXT、TEXT、MEDIUMTEXT 和 LONGTEXT.對應的這 4 種 BLOB 類型,可存儲的最大長度不同,可根據實際情況選擇.
BLOB:
1._BLOB和_text存儲方式不同,_TEXT以文本方式存儲,英文存儲區分大小寫,而_Blob是以二進制方式存儲,不分大小寫
2._BLOB存儲的數據只能整體讀出
3._TEXT可以指定字符集,_BLO不用指定字符集
sql優化建議:創建表時,定長的類型往前放(比如性別),變長的往后放(比如描述信息)
大於255個字符,超了就把文件路徑存放在數據庫中,(比如視頻,數據庫中只存路徑或url)
時間類型:
YEAR: 范圍1901 ~ 2155
DATE: 范圍1000-01-01 ~ 9999-12-3
TIME: 范圍-838:59:59 ~ 838:59:59
DATETIME(一般都用): 范圍1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
create table t1(x datetime not null default now()); #獲取當前時間
IMESTAMP: 范圍1970-01-01 00:00:00 ~ 2037
create table t3(time timestamp);
insert into t3 value(); #插入當前時間
MySQL的這兩種日期類型都能夠滿足我們的需要,存儲精度都為秒,下面就來總結一下兩種日期類型的區別:
1.DATETIME的日期范圍是1001——9999年,TIMESTAMP的時間范圍是1970——2038年
2.DATETIME存儲時間與時區無關,TIMESTAMP存儲時間與時區有關,顯示的值也依賴於時區.在mysql服務器,操作系統以及客戶端連接都有時區的設置.
3.DATETIME使用8字節的存儲空間,TIMESTAMP的存儲空間為4字節.因此TIMESTAMP比DATETIME的空間利用率更高
4.DATETIME的默認值為null;TIMESTAMP的字段默認不為空(not null),默認值為當前時間(CURRENT_TIMESTAMP),如果不做特殊處理,並且update語句中沒有指定該列的更新值,則默認更新為當前時間
create table 表名(字段名 類型);
create table t2 (d date,t time,dt datetime);
insert into t2 values('1000-01-01','-838:59:59','9999-12-31 23:59:59');
insert into t11 values(now(),now(),now()); #插入當前時間
枚舉類型與集合類型
字段的值只能在給定范圍中選擇,如單選框,多選框,如果你在應用程序或者前端不做選項限制,在MySQL的字段里面也能做限制
enum 單選+只能選枚舉范圍里的 只能在給定的范圍內選一個值
create table t1 (name char(20),gender enum('female','male'));
insert into t1 value('bob','male');
set 多選+去重+只能選在集合里的 在給定的范圍內可以選擇一個或一個以上的值(愛好1,愛好2,愛好3...)
create table t2 (name char(20),hobby set('抽煙','喝酒','燙頭'));
insert into t2 values('jack','喝酒,抽煙,燙頭');