包含:python
對於整數,M表示顯示的最大寬度;
對於浮點與定點數,M表示能夠存儲的總位數;
若是對錶字段設定ZEROFILL,該字段默認加上無符號類型屬性;
默認爲有符號類型;
序列號SERIAL:無符號,Not NULL,自增,BIGINT,UNIQUEmysql
Warning
2個數字作減法,其中有一個爲無符號類型,則結果也爲無符號類型。但設置 NO_UNSIGNED_SUBTRACTION (SQL mode)時,結果爲有符號類型。sql
mysql> SELECT IF(0, 'true', 'false');
+------------------------+
| IF(0, 'true', 'false') |
+------------------------+
| false |
+------------------------+
mysql> SELECT IF(1, 'true', 'false');
+------------------------+
| IF(1, 'true', 'false') |
+------------------------+
| true |
+------------------------+
mysql> SELECT IF(2, 'true', 'false');
+------------------------+
| IF(2, 'true', 'false') |
+------------------------+
| true |
+------------------------+
複製代碼
然而,TRUE與FALSE僅僅分表表示1與0,實例以下:安全
mysql> SELECT IF(0 = FALSE, 'true', 'false');
+--------------------------------+
| IF(0 = FALSE, 'true', 'false') |
+--------------------------------+
| true |
+--------------------------------+
mysql> SELECT IF(1 = TRUE, 'true', 'false');
+-------------------------------+
| IF(1 = TRUE, 'true', 'false') |
+-------------------------------+
| true |
+-------------------------------+
mysql> SELECT IF(2 = TRUE, 'true', 'false');
+-------------------------------+
| IF(2 = TRUE, 'true', 'false') |
+-------------------------------+
| false |
+-------------------------------+
mysql> SELECT IF(2 = FALSE, 'true', 'false');
+--------------------------------+
| IF(2 = FALSE, 'true', 'false') |
+--------------------------------+
| false |
+--------------------------------+
複製代碼
最後2段示例結果是由於2既不等於0也不等於1,也間接說明TRUE,FALSE的值爲1,0。服務器
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
小整數(16bit),有符號範圍爲[-32768,327670],無符號範圍爲[0,65535]數據結構
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
中等大小整數(24bit),有符號範圍爲[-8388608,8388607],無符號範圍爲[0,16777215]併發
INT[(M)] [UNSIGNED] [ZEROFILL]
整數(32bit),有符號範圍爲[-2147483648,2147483647],無符號範圍爲[0,4294967295]函數
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
INT的同義類型性能
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
大整數(64bit),有符號範圍爲[-9223372036854775808,9223372036854775807],無符號範圍爲[0,18446744073709551615]
SERIAL:BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE.
關於BITINT字段你應該注意以下事項:ui
DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]
定點數,十進制數。M爲總位數(精度),D爲小數點後位數(複數),M不包含小數點與符號位(-)。若是D爲0,則沒有小數點或小數部分。十進制數的最大位數(M)爲65,D支持的最大值爲30,若是省略D,則默認爲0,若是省略M,則默認爲10。
設定爲無符號,則不容許負數。
針對十進制字段的全部基本操做(+,-,*,/)以65位精度來完成。
FLOAT[(M,D)] [UNSIGNED:] [ZEROFILL]
單精度浮點數。值範圍-3.402823466E+38 to -1.175494351E-38, 0, and 1.175494351E-38 to 3.402823466E+38. 這是理論限值,實際範圍依賴於CPU硬件與操做系統。
FLOAT(M,D)是非標準的MYSQL擴展。
若是指定了UNSIGNE,則不容許負數。
M表示總位數,D表示小數點後位數。若是省略M與D,則可存儲的大小依賴於硬件。單精度浮點數精確到約7位小數。D,則不容許負數。
使用FLOAT時,由於MYSQL中以DOUBLE精度來運算,因此可能會出現一些非預期的問題。
DOUBLE[(M,D)] [UNSIGNED] [ZEROFILL]
雙精度浮點數。範圍爲:-1.7976931348623157E+308 to -2.2250738585072014E-308, 0, and 2.2250738585072014E-308 to 1.7976931348623157E+308.這是理論限值,實際範圍依賴於CPU硬件與操做系統。
M表示總位數,D表示小數點後位數。若是省略M與D,則可存儲的大小依賴於硬件。單精度浮點數精確到約15位小數。
DOUBLE(M,D)是非標準的MYSQL擴展。
若是指定了UNSIGNE,則不容許負數。
時間類型概述。關於時間類型的屬性與存儲要求的更新信息,請參見11.3節 「Date and Times Types」,11.8節「Date Type Storage Requirements」;關於時間的運算操做,見12.7節「Date and Times Functions」。
對於DATE與DATETIME範圍描述中,「supported」意味着即便早期版本的值可能有效,但沒有保證。
MYSQL容許TIME,DATETIME,TIMESTAMP的秒帶有小時部分,即微秒(6位)精度,經過type_name(fsp)來定義微妙,例如:
create table t1 (t TIME(3), dt datatime(6));
mysql> select * from t1;
+--------------+----------------------------+
| t | dt |
+--------------+----------------------------+
| 11:38:59.000 | 2019-08-03 11:39:05.000000 |
+--------------+----------------------------+
1 row in set (0.00 sec)
複製代碼
fsp值範圍爲[0,6],0表示沒有微秒,若是忽略,默認爲0。(與MYSQL標準不一樣的是,標準默認是6,這是爲了兼容早期版本)
任何TIMESTAMP或者DATETIME表字段都有自動初始化與更新屬性。
時間類型不能使用SUM(),AVG()聚合函數,由於轉換爲數值的時候遇到第一個非數字字符後丟失後面的全部內容。爲了規避這個問題,先轉換爲數字,而後執行聚合函數,而後再轉換回時間類型。
SELECT SEC_TO_TIME(SUM(TIME_TO_SEC(time_col))) FROM tbl_name;
SELECT FROM_DAYS(SUM(TO_DAYS(date_col))) FROM tbl_name;
[NATIONAL] CHAR[(M)] [CHARACTER SET charset_name] [COLLATE collation_name]
一個固定長度的字符串,在存儲時老是用空格填充到指定的長度。m以字符表示列長度。m的範圍是0到255。若是省略m,則長度爲1。
檢索char值時會刪除尾隨空格,除非啓用pad-char-to-full-length SQL模式。
[NATIONAL] VARCHAR(M) [CHARACTER SET charset_name] [COLLATE collation_name]
可變長度字符串。m以字符表示最大列長度。m的範圍是0到65535。使用1-2個字節來存儲長度字段,若是不超過255長度,則一個字符,若是超過這2個字節。
MySQL遵循標準的SQL規範,不會從varchar值中刪除尾隨空格。
小數和數字類型存儲精確的數字數據值。當須要保持精確的精度時,例如貨幣數據時,可使用這些類型。在MySQL中,numeric被實現爲decimal,所以下面關於decimal的註釋一樣適用於numeric。
MySQL以二進制格式存儲十進制值。見第12.22節「Precision Math」。
在十進制列聲明中,能夠(一般)指定精度和小數位數。例如:
salary DECIMAL(5,2)
複製代碼
在本例中,5表示精度,2表示刻度。精度表示爲值存儲的有效位數,小數位數表示小數點後能夠存儲的位數。
標準SQL要求decimal(5,2)可以存儲5位和2位小數的任何值,所以能夠存儲在salary列中的值範圍爲-999.99到999.99。
Insert的集中方式:
INSERT INTO t1 (c1,c2) VALUES (1,'a'), (NULL,'b'), (5,'c'), (NULL,'d');
複製代碼
另外也包含INSERT ... ON DUPLICATE KEY UPDATE,由於在更新階段可能會使用或不使用自動增量列的分配值。(之因此先列出上面4中Insert方式,是由於不一樣鎖模式對不一樣Insert方式影響不同s)
參數innodb_autoinc_lock_mode設置自動增量鎖模式,0:傳統;1:連續;2:交錯。
innodb_autoinc_lock_mode = 0 (「traditional」 lock mode)
針對上面4中Insert方式,都是基於表級別的AUTO-INC鎖,語句執行完就釋放鎖,不用等事務完成時才釋放鎖。但鎖表性能相對較差,好處是分配的ID連續,確保以可預測和可重複的順序爲給定的插入語句序列分配自動增量值,並確保由任何給定語句分配的自動增量值連續的。
基於語句的複製的狀況下,這意味着在從屬服務器上覆制SQL語句時,自動遞增列的值與主服務器上的值相同。多個insert語句的執行結果是肯定性的,從系統複製與主系統相同的數據。若是多個insert語句生成的自動增量值是交錯的,那麼兩個併發insert語句的結果將是不肯定的,而且不能使用基於語句的複製可靠地傳播到從屬服務器。
innodb_autoinc_lock_mode = 1 (「consecutive」 lock mode)
這是默認鎖定模式。
對於「bulk inserts」,使用表級別的AUTO-INC鎖,一次只能執行一個保存auto-inc鎖的語句。
對於「Simple inserts」,使用互斥量(一個輕量級鎖mutex),分配過程當中持有鎖並分配預先須要的數量,分配後釋放而不用等到整條語句執行完成,這有助於提升性能。若是另外一個事務持有auto-inc鎖,「簡單插入」將等待auto-inc鎖。
這種鎖定模式確保,在不預先知道行數的INSERT語句(以及在語句進行時分配自動遞增數的狀況下)的狀況下,由任何「insert like」語句分配的全部自動遞增值都是連續的,能夠保證基於語句的主從複製是安全的。
簡單地說,這種鎖定模式顯著提升了可伸縮性,同時能夠安全地用於基於語句的複製。此外,與「傳統」鎖模式同樣,由任何給定語句分配的自動增量數是連續的。對於任何使用自動增量的語句,與「傳統」模式相比,語義沒有任何變化,但有一個重要的例外。
「mixed-mode inserts」是例外狀況。用戶爲多行「簡單插入」中的某些(而不是所有)行的自動增量列提供顯式值。對於此類插入,InnoDB分配的自動增量值比要插入的行數更多。可是,自動分配的全部值都是連續生成(所以高於)最近執行的前一條語句生成的自動增量值。「超額」數字丟失。
innodb_autoinc_lock_mode = 2 (「interleaved」 lock mode)
在這種鎖模式下,不使用表級auto-inc鎖而是都是要信號量,多個語句能夠同時執行。這是最快和最可擴展的鎖模式,但在使用基於語句的複製或恢復方案時,若是從二進制日誌重放SQL語句,則不安全。
在這種鎖定模式下,自動增量值保證在全部併發執行的「insert-like」語句中都是惟一的且單調地遞增的。可是,因爲多個語句能夠同時生成數字(也就是說,數字的分配是跨語句交錯的),所以爲任何給定語句插入的行生成的值可能不是連續的。
若是惟一執行的語句是「簡單插入」,其中要插入的行數是提早知道的,那麼爲單個語句生成的數字中沒有間隙,除了「混合模式插入」。可是,當執行「大容量插入」時,任何給定語句分配的自動增量值中可能存在間隙。
每一個innodb表都有一個稱爲彙集索引的特殊索引,用於按索引大小順序存儲行的數據。
Innodb實現了標準的行鎖,共享鎖(S)與排他鎖(X)
若是事務T1在R行上持有共享鎖,那麼來自某些不一樣事務T2的請求對R行進行以下處理:
若是事務T1在R行上持有獨佔(X)鎖,則不能當即授予來自某個不一樣事務T2的請求R上任何一種類型的鎖的權限。相反,事務t2必須等待事務t1釋放對行r的鎖。
InnoDB 支持粒度鎖即容許行鎖與表鎖共存。例如LOCK TABLES ... WRITE語句在指定的表上設置表級別的獨佔鎖。爲了實現多粒度鎖,InnoDB使用intention locks。Intention locks是表級別的鎖,指示稍後須要對錶中的行使用哪一種類型的鎖(X或者S),有2種意向鎖: