MySQL存储引擎与数据类型
1 數(shù)據(jù)存儲(chǔ)引擎
存儲(chǔ)引擎的概念是MySQL的一個(gè)特性,它指定了表的類型(諸如表怎樣存儲(chǔ)與索引數(shù)據(jù)、是否支持事務(wù)、外鍵等),表在計(jì)算機(jī)中的存儲(chǔ)方式。
1.1 MySql支持的數(shù)據(jù)存儲(chǔ)引擎
查看引擎信息
通過命令來查看引擎信息
show engines;
默認(rèn)存儲(chǔ)引擎為InnoDB,例如以下列出:
| Engine | Support | Comment | Transactions | XA | Savepoints |
|---|---|---|---|---|---|
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
Support表示是否支持該引擎,Comment表示關(guān)于該引擎的評(píng)論。Transactions比表示該引擎是否支持事務(wù)。XA表示此引擎支持的分布式是否符合XA規(guī)范,Savepoints表示此引擎是否支持事務(wù)處理中的保存點(diǎn)。
還能夠通過show variables來查看,命令例如以下
show variables like 'have%';
顯示結(jié)果例如以下:
| Variable_name | Value |
|---|---|
| have_compress | YES |
| have_crypt | NO |
| have_dynamic_loading | YES |
| have_geometry | YES |
| have_openssl | DISABLED |
| have_profiling | YES |
| have_query_cache | YES |
| have_rtree_keys | YES |
| have_ssl | DISABLED |
| have_statement_timeout | YES |
| have_symlink | YES |
yes表示支持,no表示不支持,DISABLED表示支持但未開啟
查看默認(rèn)存儲(chǔ)引擎
show variables like '%storage_engine%';
查詢結(jié)果例如以下:
| Variable_name | Value |
|---|---|
| default_storage_engine | InnoDB |
| default_tmp_storage_engine | InnoDB |
| disabled_storage_engines | |
| internal_tmp_disk_storage_engine | InnoDB |
1.2 改動(dòng)默認(rèn)引擎
方式1: 改動(dòng)my.ini配置文件
在安裝文件夾下的my.ini文件里加入或改動(dòng)default-storage-engine,如設(shè)置默認(rèn)引擎為INNODB,在my.ini文件里加入例如以下一行內(nèi)容:
default-storage-engine=INNODB
重新啟動(dòng)mysql服務(wù)生效。
方式2:通過命令設(shè)置
一般在創(chuàng)建表時(shí)我們能夠設(shè)置引擎
CREATE TABLE `test` (
`db` double DEFAULT NULL,
`dm` decimal(10,0) DEFAULT NULL,
`gender` int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
當(dāng)創(chuàng)建完畢,我們希望改動(dòng)表的引擎時(shí),能夠運(yùn)行例如以下命令:
alter table table_name engine= engine_name;
比方我們想設(shè)置表test的引擎為MyISAM,能夠運(yùn)行:
alter table test engine=MyISAM;
1.3 存儲(chǔ)引擎的選擇
選擇一個(gè)合適的存儲(chǔ)引擎,才干發(fā)揮數(shù)據(jù)庫更好的功能。由于各種數(shù)據(jù)引擎有著不同的特性優(yōu)勢與適用場合。因此須要先了解它們的特性。才干有助于我們更好的選擇合適的引擎。
以下列出了幾種常見的引擎以及他們的特性:
MyISAM
此存儲(chǔ)引擎不支持事務(wù)、外鍵。但訪問速度快,對(duì)事務(wù)完整性不要求,適合于對(duì)事務(wù)沒有要求,并發(fā)相對(duì)較低,以訪問為主的場合。
InnoDB
支持事務(wù),具有提交、回滾、崩潰恢復(fù)的事務(wù)安全。相對(duì)MySQL來說,寫處理能力差些,且會(huì)占用較多磁盤空間以保留數(shù)據(jù)和索引。在須要進(jìn)行頻繁的更新刪除操作。實(shí)現(xiàn)并發(fā)控制,須要支持事務(wù)的場合適合使用它。
MEMORY
該存儲(chǔ)引擎使用存在于內(nèi)存中的內(nèi)容來創(chuàng)建表,每一個(gè)表實(shí)際相應(yīng)一個(gè)磁盤文件,格式為.frm;這類表由于數(shù)據(jù)在內(nèi)存中,且默認(rèn)使用HASH索引,所以訪問速度非常快;但一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)會(huì)丟失。在涉及數(shù)據(jù)量較小,須要進(jìn)行高速訪問的場合適用此引擎。
2 數(shù)據(jù)類型
MySql提供了數(shù)據(jù)類型來定義我們存儲(chǔ)的數(shù)據(jù)的類型,不同的數(shù)據(jù)類型有著不同的存儲(chǔ)功能與占用的空間大小。
Mysql提供的數(shù)據(jù)類型有:整數(shù)類型、浮點(diǎn)數(shù)類型與定點(diǎn)數(shù)類型、位類型、字符串類型、日期與時(shí)間類型。
2.1 整數(shù)類型
| 類型 | 字節(jié) | 范圍(有符號(hào)) | 范圍(無符號(hào)) |
|---|---|---|---|
| TINYINT | 1 | (-128。127) | (0。255) |
| SMALLINT | 2 | (-32 768。32 767) | (0,65 535) |
| MEDIUMINT | 3 | (-8 388 608。8 388 607) | (0,16 777 215) |
| INT或INTEGER | 4 | (-2 147 483 648,2 147 483 647) | (0。4 294 967 295) |
| BIGINT | 8 | (-9 233 372 036 854 775 808。9 223 372 036 854 775 807) | (0。18 446 744 073 709 551 615) |
對(duì)于整數(shù)類型。我們須要依據(jù)實(shí)際存儲(chǔ)數(shù)據(jù)的大小來決定我們選擇哪種類型來存儲(chǔ)。諸如當(dāng)要存儲(chǔ)的數(shù)據(jù)大小不超過255,我們選擇TINYINT就ok。既滿足要求又節(jié)約內(nèi)存。
在使用的時(shí)候,當(dāng)我們不清楚那個(gè)類型的范圍,我們能夠通過幫助命令來查看。諸如查看int類型,我們能夠鍵入 ? int; (或 help int。)來查看int的具體信息。例如以下所看到的:
ZEROFILL(0填充)
整形設(shè)置0填充,會(huì)使類型自己主動(dòng)成為unsigned,而且各個(gè)整形類型都有默認(rèn)填充位。例如以下圖:
2.2 浮點(diǎn)數(shù)類型、定點(diǎn)數(shù)類型、位類型
浮點(diǎn)數(shù)類型
| 類型 | 字節(jié) | 范圍(有符號(hào)) | 范圍(無符號(hào)) | 作用 |
|---|---|---|---|---|
| FLOAT | 4 | (-3.402 823 466 E+38,1.175 494 351 E-38)。0,(1.175 494 351 E-38,3.402 823 466 351 E+38) | 0,(1.175 494 351 E-38,3.402 823 466 E+38) | 單精度浮點(diǎn)數(shù)值 |
| DOUBLE | 8 | (1.797 693 134 862 315 7 E+308,2.225 073 858 507 201 4 E-308),0。(2.225 073 858 507 201 4 E-308。1.797 693 134 862 315 7 E+308) | 0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308) | 雙精度浮點(diǎn)數(shù)值 |
| DECIMAL(M,D) | M+2 | 依賴于M和D的值 | 依賴于M和D的值 | 高精度小數(shù)值 |
關(guān)于DECIMAL特別指出:
M是數(shù)字的最大數(shù)(精度)。其范圍為1~65。M 的默認(rèn)值是10。M的值為整數(shù)的長度加小數(shù)的長度,不包括小數(shù)點(diǎn)與 “-” 負(fù)號(hào)。
D是小數(shù)點(diǎn)右側(cè)數(shù)字的數(shù)目(標(biāo)度)。
其范圍是0~30,但不得超過M。假設(shè)D省略不寫則默覺得0。此時(shí)無小數(shù)部分。
存儲(chǔ)整數(shù)部分長度為M-D(不滿足會(huì)出錯(cuò))。小數(shù)長度為D(大于D的部分會(huì)被截?cái)啵?/p>
關(guān)于使用方法:
對(duì)于浮點(diǎn)數(shù)類型與DECIMAL的選擇,當(dāng)我們對(duì)小數(shù)精度要求非常高時(shí)。此時(shí)推薦使用DECIMAL類型。由于DECIMAL類型存儲(chǔ)的是字符串,而浮點(diǎn)數(shù)類型存儲(chǔ)的是近似值。對(duì)于精度要求不高的情況下。視存儲(chǔ)的數(shù)據(jù)的范圍而定。
做例如以下一個(gè)測試:
創(chuàng)建一個(gè)有float類型的f_data , double 類型的db_data, decimal 類型的 dm_data的表。并同一時(shí)候插入123.456到三個(gè)字段中。
然后我們查詢123.456的f_data時(shí)發(fā)現(xiàn)查詢?yōu)榭眨樵儭?23.456’ 的dm_data時(shí)查詢出了結(jié)果。實(shí)驗(yàn)驗(yàn)證了上述結(jié)論,float存儲(chǔ)的是近似值。所以查詢不到。而decimal存儲(chǔ)的是字符串,所以能夠精確查詢。
位類型
| 位類型 | 字節(jié) | 最大值(位) | 最小值(位) |
|---|---|---|---|
| BIT(M) | 1~8 | BIT(64) | BIT(1) |
位類型BTM占用的字節(jié)數(shù)是M,取值在1~8之間。BIT類型的存儲(chǔ)大小視其精度而定。
能夠使用b’value’符號(hào)寫位字段值。
value是一個(gè)用0和1寫成的二進(jìn)制值。例如以下:
2.3 字符串
2.3.1 char系字符串類型
| 類型 | 字節(jié) | 描寫敘述 |
|---|---|---|
| CHAR(M) | M | M為0~255之間的整數(shù) |
| VARCHAR(M) | M | M為0~65535之間的整數(shù) |
在數(shù)據(jù)存儲(chǔ)范圍合適的情況下,當(dāng)存儲(chǔ)的數(shù)據(jù)常常變動(dòng)時(shí)使用推薦varchar。否則使用char 。
2.3.2 BINARY系字符串
| 類型 | 字節(jié) | 描寫敘述 |
|---|---|---|
| BINARY(M) | M | 長度0~M個(gè)字節(jié)的定長字節(jié)字符串 |
| VARBINARY(M) | M | 長度0~M個(gè)字節(jié)的變長字節(jié)字符串,值的長度+1個(gè)字節(jié) |
與char系相似,不同的是BINARY系存儲(chǔ)的能夠是二進(jìn)制數(shù)據(jù)(如圖片、視頻、音樂)。而char系僅僅能存儲(chǔ)字符數(shù)據(jù)。
2.3.3 TEXT系字符串類型
| 類型 | 字節(jié) | 描寫敘述 |
|---|---|---|
| TINYTEXT | 0~255字節(jié) | 值的長度+2個(gè)字節(jié) |
| TEXT | 0~65535字節(jié) | 值的長度+2個(gè)字節(jié) |
| MEDIUMTEXT | 0~167772150字節(jié) | 值的長度+3個(gè)字節(jié) |
| LONGTEXT | 0~4294967295字節(jié) | 值的長度+4個(gè)字節(jié) |
當(dāng)需存儲(chǔ)大量的字符數(shù)據(jù)時(shí),能夠選擇TEXT系字符串,至于選擇哪一個(gè)看存儲(chǔ)字符長度。
2.3.4 BLOB系字符串
| 類型 | 字節(jié) |
|---|---|
| TINYBLOB | 0~255字節(jié)。值的長度+1個(gè)字節(jié) |
| BLOB | 0~65535字節(jié)。值的長度+2個(gè)字節(jié) |
| MEDIUMBLOB | 0~167772150字節(jié)。值的長度+3個(gè)字節(jié) |
| LONGBLOB | 0~4294967295字節(jié),值的長度+4個(gè)字節(jié) |
與TEXT系相似。不同的是BLOB系存儲(chǔ)的能夠是二進(jìn)制數(shù)據(jù)(如圖片、視頻、音樂),而TEXT系存儲(chǔ)的僅僅能是字符數(shù)據(jù)
2.3.5 枚舉類型
ENUM(‘value1’,’value2’,…)
枚舉類型僅僅能有一個(gè)值的字符串,從值列’value1’。’value2’,…,NULL中或特殊 ”錯(cuò)誤值中選出。ENUM列最多能夠有65,535個(gè)截然不同的值。
ENUM值在內(nèi)部用整數(shù)表示,所以我們能夠使用整數(shù)插入或查詢來取代字符串。
例如以下我們創(chuàng)建一個(gè)表,包括枚舉字段day,我們插入枚舉值
我們還能夠通過整數(shù)值插入和查詢
當(dāng)我們插入非設(shè)置的枚舉值時(shí)會(huì)出錯(cuò),例如以下錯(cuò)誤:
mysql> insert into t_enum values('星期天');
ERROR 1265 (01000): Data truncated for column 'day' at row 1
2.3. 6 SET類型
SET(‘value1’,’value2’,…)
一個(gè)set集合。當(dāng)中的字符串對(duì)象能夠有零個(gè)或多個(gè)值的組合。每一個(gè)值必須來自列值’value1’,’value2’。…SET列最多能夠有64個(gè)成員。SET值在內(nèi)部用整數(shù)表示。
插入時(shí)的數(shù)據(jù)順序與終于在表中的順序無關(guān)。
使用演示樣例:
創(chuàng)建了一個(gè)t_set的表。day是一個(gè)set類型的字段,能夠插入set中的隨意值的組合。插入順序不影響終于插入到表中的數(shù)據(jù)。能夠通過指定字符串來查詢,此字符串的順序卻對(duì)查詢結(jié)果有影響,這是一個(gè)奇怪的地方
使用整數(shù)插入、查詢、刪除、更新
set內(nèi)部使用整數(shù)來表示,value、二進(jìn)制、十進(jìn)制的相應(yīng)關(guān)系例如以下
當(dāng)我們插入數(shù)字15時(shí),即1+2+4+8。各個(gè)set的value相應(yīng)的值(星期一~星期四)
當(dāng)我們插入數(shù)字8時(shí),即相應(yīng)value為8的‘星期四’,其它組合依次類推
刪除指定值(更新與之相似,不列出了)
2.4 日期和時(shí)間類型
| 類型名 | 字節(jié) | 格式 | 范圍 |
|---|---|---|---|
| date | 3 | YYYY-MM-DD | 1000-01-01 ~ 9999-12-31 |
| datetime | 8 | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
| timestamp | 4 | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:01 ~ 2038 |
| year | 1 | YYYY | 1901 ~ 2155 |
| TIME | 3 | -838:59:59 ~ 838:59:59 |
通過命令 select curdate(); 或select now();來查看當(dāng)前日期
日期與時(shí)間類型的使用
假設(shè)要表示年月日,一般使用date
假設(shè)要表示年月日時(shí)分秒,一般使用datetime
假設(shè)要頻繁更新當(dāng)前時(shí)間。則能夠選擇使用timestamp
假設(shè)要表示年,能夠使用year,占用字節(jié)少
假設(shè)要表示時(shí)分秒,能夠使用time
使用演示樣例
后記:總結(jié)了下MySql的存儲(chǔ)引擎與數(shù)據(jù)類型。更具體的使用方法再慢慢完好吧~
總結(jié)
以上是生活随笔為你收集整理的MySQL存储引擎与数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 项目不需要SVN控制的时候,该怎么办
- 下一篇: uni-app导航栏开发大全及注意事项