從零開始了解數據庫開發
- MySQL中的數據類型
- 數字類型
- 字符串類型
- 日期類型
MySQL中的數據類型
MySQL數據庫匯中,每一條數據都有其類型,主要分為三類:數字類型,字符串類型,日期時間類型。下面我們依次來介紹
數字類型
類型分類 | 數據類型 | 描述 |
---|---|---|
數字類型 | INT | 整數類型,用于存儲整數。 有符號 -231 ~ 231-1 |
數字類型 | TINYINT | 小整數類型,用于存儲非常小的整數。有符號 -128 ~ 127 |
數字類型 | SMALLINT | 小整數類型,用于存儲較小的整數。 有符號 -215 ~ 215-1 |
數字類型 | MEDIUMINT | 中等大小整數類型,用于存儲中等大小的整數。 |
數字類型 | BIGINT | 大整數類型,用于存儲大整數。 有符號 -263 ~ 263-1 |
數字類型 | FLOAT[(M , D)] | 單精度浮點數類型,用于存儲單精度浮點數。 M指定長度,D指定小數位數 |
數字類型 | DOUBLE [(M , D)] | 雙精度浮點數類型,用于存儲雙精度浮點數。 |
數字類型 | DECIMAL [(M , D)] | 定點數類型,用于存儲精確的小數。 |
數字類型 | BIT(M) | 位類型。M指定位數,默認值1 ,范圍1-64 |
數字類型分為了整型,浮點型,位類型。創建表時可以選擇合適的數據類型進行儲存
我們先來看整型:我們創建這樣一個表
我們插入一下age這個數據:
可以看到對于tinyint類型,超出其范圍的數據是不能被插入到數據表中的。如果是unsigned tinyint類型呢
對于無符號的,返回就是0~255,超出范圍的數據就不能被儲存。對于其他整型類型也是一樣的。
這個對于非法數據插入時的保持攔截是mysql的一個重要特性,在c/c++中,出現這種超出范圍的存儲char c = 123546
,編譯器不一定會報錯,可能會優化進行截斷,c儲存的值就不是我們賦予的值。如果數據庫也這么處理,那么數據庫中的數據將變得不可信!所以這種攔截可以保證插入到數據庫中的數據一定是合法的!所以:數據類型本身也是一種約束
注意:盡量不使用unsigned,對于int類型可能存放不下的數據,int unsigned同樣可能存放不下,與其如此,還不如設計時,將int類型提升為bigint類型 但是也一定要注意使用合適的類型,對于數據庫龐大的數據,每一個都浪費一點,那么會造成很大的資源浪費!
再來看字節類型BIT(M),我們創建一個表:
可以看到超出1位的數值不能被插入。
最后來看浮點數:
float[(m, d)] [unsigned] : M指定顯示長度,d指定小數位數,占用空間4個字節
創建一張這個表
我們插入幾行數據
通過這個插入可以發現,對于整數部分超出M-d位的是不能被存儲的,如果小數部分超出,則會進行四舍五入保值。注意四舍五入后如果超出范圍,也會被攔截。對于浮點型的無符號類型,是對儲存類型直接去掉負數,儲存的上限不會變。
當把數據類型改為float時,如果數值超出其儲存范圍,會出現損失精度的現象:
對于float無法儲存的數據,這里建議使用decimal。
我們建立一個這樣的表,插入同樣的數據:
decimal的精度顯然更高!
decimal整數最大位數m為65。支持小數最大位數d是30。如果d被省略,默認為0.如果m被省略,默認是10。
建議:如果希望小數的精度高,推薦使用decimal。
字符串類型
類型分類 | 數據類型 | 描述 |
---|---|---|
字符串類型 | VARCHAR | 變長字符串類型,用于存儲可變長度的字符串。 最多只能是65535 |
字符串類型 | CHAR | 定長字符串類型,用于存儲固定長度的字符串。 最多只能是255 |
字符串類型 | TEXT | 文本類型,用于存儲長文本。 |
字符串類型 | TINYTEXT | 微型文本類型,用于存儲非常短的文本。 |
字符串類型 | MEDIUMTEXT | 中等長度文本類型,用于存儲中等長度的文本。 |
字符串類型 | LONGTEXT | 長文本類型,用于存儲非常長的文本。 |
字符串類型 | BLOB | 二進制大對象類型,用于存儲二進制數據。 |
字符串類型 | TINYBLOB | 微型二進制大對象類型,用于存儲非常小的二進制數據。 |
字符串類型 | MEDIUMBLOB | 中等長度二進制大對象類型,用于存儲中等長度的二進制數據。 |
字符串類型 | LONGBLOB | 長二進制大對象類型,用于存儲非常長的二進制數據。 |
字符串類型 | ENUM | 枚舉類型,用于存儲枚舉值,即一組預定義的字符串。 |
字符串類型 | SET | 集合類型,用于存儲一組預定義的字符串,可以包含多個值。 |
字符串類型最典型的就是 char與varchar。我們先來看char,這是一個固定長度的字符串,我們的插入必須是小于等于其長度。
這里發現漢字和英語字母都是最大插入三個,但是utf8編碼中漢字是占3個字節,所以:mysql中的字符與c/c++中不同 ,字符可以是字母或漢字。c/C++中字符就是一個字節,mysql不是!
再來看varchar(L): 可變長度字符串,L表示字符長度,最大長度65535個字節。
這里性質與char一致,大于其長度的無法插入。
再來看這樣一個現象,當我們想要修改varchar的儲存長度為65535時,會出現一個報錯:
提升我們不能擴展到65535,而只能到16383。這里是因為根據字符集的規定,中文字符可能會使用不同的字節數:
- 如果你使用的是utf8mb4字符集(MySQL推薦使用的完整UTF-8編碼),每個中文字符確實占用4個字節
- 如果是utf8字符集,每個中文字符占用3個字節
- 如果是latin1字符集,每個中文字符可能無法正常存儲
所以對于utf8mb4字符集字符集65535個字節最多只能儲存16383個中文字符!
varchar(len)與編碼密切相關!varchar長度可以指定為0到65535之間的值,但是有1 - 3 個字節用于記錄數據大小,所以說有效字節數是65532
如果儲存的長度過長,建議使用大文本儲存。
如何選擇定長或變長字符串?
- 如果數據確定長度都一樣,就使用定長(char),比如:身份證,手機號,md5
- 如果數據長度有變化,就使用變長(varchar), 比如:名字,地址,但是你要保證最長的能存的進去。
- 定長的磁盤空間比較浪費,但是效率高。
- 變長的磁盤空間比較節省,但是效率低。
- 定長的意義是,直接開辟好對應的空間
- 變長的意義是,在不超過自定義范圍的情況下,用多少,開辟多少
- 兩者的關系與 c/c++中的 char[ ] 與 string 很相似
日期類型
類型分類 | 數據類型 | 描述 |
---|---|---|
日期類型 | DATE | 日期類型,用于存儲日期值(年-月-日)。 |
日期類型 | TIME | 時間類型,用于存儲時間值(時:分:秒)。 |
日期類型 | DATETIME | 日期時間類型,用于存儲日期和時間值(年-月-日 時:分:秒)。 |
日期類型 | TIMESTAMP | 時間戳類型,用于存儲時間戳值,表示自1970-01-01 00:00:00 UTC以來的秒數。 |
常用的日期有如下三個:
- date :日期 ‘yyyy-mm-dd’ ,占用三字節。記錄需要儲存的時間日期
- datetime :時間日期格式 ‘yyyy-mm-dd HH:ii:ss’ 表示范圍從 1000 到 9999 ,占用八字節。記錄需要儲存的時間日期
- timestamp :時間戳,從1970年開始的 yyyy-mm-dd HH:ii:ss 格式和 datetime 完全一致,占用四字節。一個表中可以有多個TIMESTAMP字段,但只有一個可以設置為
DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
。這個是記錄數據的創建/修改時間。