mysql常用資料型別
mysql識別符號命名規則
mysql中utf8、utf8mb4字符集的區別
關於null
資料庫本身也提供了一些鎖,按加鎖方式分為
按照讀寫許可權分為
排它鎖、共享鎖都是資料庫提供的鎖機制,直接呼叫資料庫的相關語句即可。
共享鎖可能發生死鎖問題:一塊資料已經加了共享鎖,如果乙個事務先對這塊資料進行讀,再進行寫,寫操作需要等待共享鎖釋放才能執行,而這個事務的寫操作尚未執行,事務沒有提交,一直持有共享鎖,寫操作永遠等不到共享鎖釋放,即造成了死鎖。
其它執行緒等待獲取鎖,如果等待指定時間後還沒獲取到鎖,會丟擲超時等待異常。
按鎖粒度分為
eg. where id>=1 and id<=10,操作id在[1,10]上的記錄,會給[1,10]整個id區間加鎖,加鎖範圍的整個區間,不僅僅只是區間上存在的記錄。mysql提供了多種儲存引擎,最常見的有2種:myisam 、innodb 。假設之前刪除了id=5、id=8的記錄,這2行不存在的記錄即間隙,也會被鎖住,暫時不能被其它執行緒訪問。
myisam
myisam是5.5之前預設的儲存引擎,適合建立
innodb
innodb是mysql5.5及其之後的預設儲存引擎,適合建立
執行insert、update、delete語句之前,innodb會自動給涉及到的資料集加排它鎖,但只有在sql語句走索引時加的排它鎖才是行鎖,表沒有建立索引或者sql語句沒有走索引時加的排它鎖是表鎖。
innodb的行鎖是給索引中的行加鎖,表鎖是給資料表中的行加鎖。行鎖的效能遠高於表鎖,盡量讓sql語句走索引,一來可以快速定位記錄位置,二來借助行鎖可以實現更高的併發。
數值型資料型別
描述tinyint
-128 ~ 127
smallint
正負3w+
mediumint
正負800w+
int 或者 integer
正負21億+
bigint
正負900千萬億+
float
單精度,4位元組,10的-38次方
double
雙精度,8位元組,10的-308次方
decimal
定點型整型可以指定最大位數,eg. int(11),不指定預設為可儲存的最大位數。
浮點型、decimal可以指定總位數、小數字數,eg. double(10,2),最長10位,小數2位(超出會四捨五入),decimal不指定預設為(10,0)。
float、double有誤差,如果對精度要求很高,比如涉及到錢財,用decimal。
字串資料型別
最大字元數
char
255varchar
6w+tinytext
255text
6w+mediumtext
1千萬+
longtext
42億+
char、varchar可指定字元數、可設定預設值,eg. varchar(5) 最多只能儲存5個字元,其它字串型別不能指定長度、預設值。
char是定長字串,內容長度不夠時自動補空格,適合儲存固定長度的字串,varchar是變長字串。
日期時間
資料型別
範圍date
yyyy-mm-dd,1000-01-01 ~ 9999-12-31
datetime
yyyy-mm-dd hh:mm:ss ,1000-01-01 00:00:00 ~ 9999-12-31 23:59:59
timestamp
yyyy-mm-dd hh:mm:ss,1970-01-01 00:00:00 ~ 2038-01-19…
運算元據庫時,使用的就是上面的格式,eg. timestamp
insert
into tb_user (create_time)
values
('2019-02-02 09:02:20'
);
增刪改是這個格式,查詢返回的也是這個格式。可以直接new date()獲取當期的日期時間,date使用util包下的date即可。
datetime、timestamp的區別是能表示的範圍不同,datetime 8位元組,timestamp 4位元組,datetime能表示的範圍更大。
時間日期型別獨有的選項:根據當前時間戳更新。勾選後,如果插入時未設定該字段的值,會自動使用當前時間;每次更新該條記錄時,不管有沒有手動set該字段的值,該字段都會更新為當前時間。如果要記錄的是最近一次操作的時間,可以勾選;其他情況下,都應該手動set設定值。
二進位制資料
mysql可以儲存二進位制資料,但操作二進位制資料的效能並不好,盡量少用二進位制資料型別。
關於 enum 列舉
mysql支援enum這種資料型別,插入列舉型別時,mysql會先檢查值是否在允許值列表中,如果不在則檢查是否在列舉的索引列表中,在列舉索引列表中的值也可以插入。
比如enum的允許值是字串"0"、「1」、「2」,對應的索引列表是1、2、3(從1開始)
不熟悉mysql列舉特性的人使用容易出錯,盡量避免使用列舉。
mysql識別符號識別符號包括表名、欄位名、資料庫程式設計中的變數名
建表時尤其要注意:欄位名不要使用資料庫關鍵字,比如 type,可以換成 ***_type
utf8的表示乙個字元最大可用三個位元組,基本可以表示所有字元,但表示不了極其生僻的字元、新增的字元,比如emoji 表情。
utf8mb4是utf8的超集,mb4即most bytes 4的意思,用於相容四位元組的unicode。
一般使用utf8就夠了,當然使用utf8mb4相容性更好。
在mysql中,如果不指定欄位not null,字段預設可以為null。
(資料庫十一)MySQL 儲存引擎及其鎖機制
常用的儲存引擎如下 1 innodb 引擎 innodb 引擎提供了對資料庫 acid 事務的支援,並且還提供了行級鎖和外來鍵的約束,它的設計目標就是處理大資料容量的資料庫系統。mysql 5.7.15版本預設使用的是 innodb 版本 2 myiasm引擎 原本mysql的預設引擎 不提供事務的...
Innodb儲存引擎的鎖機制(一)
隔離級別到底如何實現的呢?鎖 mvcc 鎖是用於管理不同事務對共享資源的併發訪問 表鎖與行鎖的區別 鎖定粒度 表鎖 行鎖 加鎖效率 表鎖 行鎖 衝突概率 表鎖 行鎖 併發效能 表鎖 行鎖 innodb儲存引擎支援行鎖和表鎖 另類的行鎖 行鎖的演算法 users表的id和idcode和name列是索引...
MySql儲存引擎InnoDB的鎖
innodb實現了以下兩種型別的行鎖 共享鎖 s 允許乙個事務去讀一行,阻止其他事務獲得相同的資料集的排他鎖。排他鎖 x 允許獲得排他鎖的事務更新資料,阻止其他事務獲得相同資料集的共享鎖和排他鎖。共享鎖就是我讀的時候,你可以讀,但是不能寫。排他鎖就是我寫的時候,你不能讀也不能寫。另外,為了允許行鎖和...