一、mysql
數據類型
mysql
支持的所有的數據類型。
1.1. 字符串類型
char(1)
是固定長度,我們設置長度是多少,只能輸入多少。長度可以再0-255
的任意值。
varchar
類型的長度是可變的,例如,在創建表時指定了最大長度是100
,當我們存儲數據之後可能不夠100
個字符串,那麼對於varchar
時,使用多少分配多少, varchar
類型實際佔用的空間爲字符串的實際長度加一。這樣,即可有效節約系統的空間。
但是我們還要注意,當我們varchar(5)
的時候,其實是在所佔用的字節數的實際長度的基礎上家1
,最後一個字符串的結束標識符佔用了一個字節。
另外varchar
類型將會hello_
最後面的空格保留着,而char
類型中hello_
後面的空格自動刪除掉。(_
標識空格)。
最後我們需要對blob
和text
做一個簡單的認識:
text
值對大小寫不敏感,可以將text
列視爲varchar
列,blob
和text
長度也是安裝實際佔用的;blob
可以存儲圖片,text
不行,只可以存儲純文本文件。- 當保存或檢索BLOB和TEXT列的值時不刪除尾部空格 。
注意:我們需要慎用這兩個字段,mysql
會將這兩個類型的值會當做一個獨立的對象處理,會建立一個單獨的區域進行存儲,每個值會採用1~4個指針,指向實際存儲位置;並且如果對這兩個字段進行排序,只能針對最前面的max_sort_length
。 如果只需要對前面的更少的字節進行排序,那麼可以通過設置max_sort_length
參數或者substring(value,length)
來截取部分字符串; 創建臨時表的情況下,因爲如果臨時表大小超過max_heap_table_size
或者tmp_table_size
,就會將臨時表存儲在磁盤上,進而導致整體速度下降 。
1.2. 數值型類型
int/integer
:當我們建表的時候:
create table table_name (
id int,
......
)
我們設置字段是int/integer
類型時,默認是帶符號型數據,數據範圍是(-2147483648, 2147483647)
,這是我們在去設置int(4)
設置int
類型的長度是沒啥用處的,而設置長度時候,並不是控制我們輸入數據的大小和輸入數據的長度,因爲當我們設置類型爲int/integer
時,默認的長度就是11
;所以那麼設置int/integer(5)
這種又啥用呢?
其實是因爲我們使用的類型不對,我們需要這樣設置屬性:
create table table_name (
id int(3) unsigned zerofill,
......
)
這時候我們設置的int(3)
纔會其中用的,當我們填充字段的時候輸入1
的時候,實際上會出現001
這樣。這樣的意味着,當我們輸入的數據不夠三位時就會用0
填充。另外如果設置無符號數據的時候id int(3) unsiend zerofill
,這樣就可以了。
這裏我們需要注意下float
、double
和decimal
三種類型:
float
:最大的精度是6
;double
:最大的精度是8
,如果長度超過會丟失精度。float
和double
是非標準類型,在數據庫中保存近似值。建議使用decimal
,這種數據類型是一字符串形式保存數值的。
最後我們說一下decimal
類型,語法中column_name decimal(p, d)
,p
表示有效數字數的精度,範圍是1~65
;d
表示小數點後面的位數,範圍是0~30
。mysql
要求d
小於等於p
。
當我們設置decimal(5,2)
:取值範圍是-999.99
到999.99
。
實例 | 結果 | 原因 |
---|---|---|
999.123 |
999.12 |
超出的部分四捨五入 |
12.3 |
12.30 |
位數不夠會補零 |
1000.00 | 報錯 | 超出範圍 |
1.3. 時間和日期類型
這些類型基本上就沒事可說的了。
1.4. 枚舉類型
enum
類型又稱爲枚舉類型,在創建表時,enum
類型的取值範圍就以列表的形式指定了。其基本形式如下:屬性名 enum('值1','值2',...,'值n')
,其中屬性名參數指定字段的名稱,值n
參數表示列表中的第n個值,這些值末尾的空格將會被系統直接刪除。
enum
類型最多可枚舉65 535
個元素。
create table table_name (
sex enum('男', '女') ,
......
)
1.5. set
類型
set
類型最多枚舉64
個元素。
set
是一個字符串對象,可以有零或多個值,其值來自表創建時規定的允許的一列值。指定包括多個set
成員的set
列值時各成員之間用逗號(‘,’)
間隔開。所以set
成員值本身不能包含逗號。
create table table_name (
name set('1', '2', '3', '5') ,
......
)
二、MySQL
引擎
mysql
常用的引擎是三種:InnoDB
存儲引擎、MyISAM存儲引擎
和Memory存儲引擎
。
2.1. InnoDB
存儲引擎
InnoDB
給MySQL
的表提供了事務處理、回滾、崩潰修復能力和多版本併發控制的事務安全。 後面版本的 MySQL
的默認存儲引擎就是InnoDB
。
InnoDB
支持自增主鍵和外鍵。
InnoDB
中,創建的表的表結構存儲在frm
文件。數據和索引存儲在innodb_data_home_dir
和innodb_data_file_path
定義的表空間中。
InnoDB
的優勢在於提供了良好的事務處理、崩潰修復能力和併發控制。缺點是讀寫效率較差,佔用的數據空間相對較大。
2.2. MyISAM
存儲引擎
MyISAM
是MySQL
中常見的存儲引擎,曾經是MySQL
的默認存儲引擎。
MyISAM
的表存儲成3個文件。文件的名字與表名相同。拓展名爲frm
、myd
、myi
。其實,frm
文件存儲表的結構;myd
文件存儲數據,是myData
的縮寫;myi
文件存儲索引,是myIndex
的縮寫。
MyISAM
的優勢在於佔用空間小,處理速度快。缺點是不支持事務的完整性和併發性。
2.3. Memory
存儲引擎
memory
是MySQL
中一類特殊的存儲引擎。它使用存儲在內存中的內容來創建表,而且數據全部放在內存中。
每個基於memory
存儲引擎的表實際對應一個磁盤文件。該文件的文件名與表名相同,類型爲frm
類型。該文件中只存儲表的結構。而其數據文件,都是存儲在內存中,這樣有利於數據的快速處理,提高整個表的效率。
memory
默認使用哈希索引。速度比使用B型樹索引快。 想用B型樹索引,可以在創建索引時指定。
memory
用到的很少,因爲它是把數據存到內存中,如果內存出現異常就會影響數據。如果重啓或者關機,所有數據都會消失。因此,基於memory
的表的生命週期很短,一般是一次性的。
三、存儲引擎對比和選擇
特性 | InnoDB |
MyISAM |
Memory |
---|---|---|---|
事物安全 | 支持 | 不支持 | 不支持 |
存儲限制 | 64TB |
有限制 | 有限制 |
空間使用 | 高 | 低 | 低 |
內存使用 | 高 | 低 | 高 |
插入速度 | 低 | 高 | 高 |
外鍵支持 | 支持 | 不支持 | 不支持 |
***InnoDB
***:支持事務處理,支持外鍵,支持崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那選擇InnoDB
有很大的優勢。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇InnoDB
,因爲支持事務的提交(commit
)和回滾(rollback
)。
***MyISAM
***:插入數據快,空間和內存使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM
能實現處理高效率。如果應用的完整性、併發性要求比 較低,也可以使用。
***MEMORY
***:所有的數據都在內存中,數據的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對數據的安全性要求較低,可以選擇MEMOEY
。它對錶的大小有要求,不能建立太大的表。所以,這類數據庫只使用在相對較小的數據庫表。
同一個數據庫也可以使用多種存儲引擎的表。如果一個表要求比較高的事務處理,可以選擇InnoDB
。這個數據庫中可以將查詢要求比較高的表選擇MyISAM
存儲。如果該數據庫需要一個用於查詢的臨時表,可以選擇MEMORY
存儲引擎。
參考文章: https://www.cnblogs.com/yuxiuyan/p/6511837.html (二、三部分參考文章鏈接,大家可以去自己看看)