MySQL資料型別和儲存機制

2021-08-26 14:44:56 字數 2137 閱讀 3659

資料型別算是一種字段約束,它限制每個欄位能儲存什麼樣的資料、能儲存多少資料、能儲存的格式等。mysql/mariadb大致有5類資料型別,分別是:整形、浮點型、字串型別、日期時間型以及特殊的enum和set型別。

資料型別之所以能限定欄位的資料儲存長度,是因為在建立表時在記憶體中嚴格劃定了位址空間,位址空間的長度是多少就能儲存多少位元組的資料。當然,這是乙個很粗獷的概念,更具體的儲存方式見下面的描述。

資料型別限定範圍的方式有兩種:一是嚴格限定空間,劃分了多少空間就只能儲存多少資料,超出的資料將被切斷;二是使用額外的位元組的bit位來標記某個位址空間的位元組是否儲存了資料,儲存了就進行標記,不儲存就不標記。

對於整型資料型別來說,它嚴格限定空間,但它和字元不同,因為每個已劃分的位元組上的bit位上的0和1直接可以計算出數值,所以它的範圍是根據bit位的數量值來計算的。乙個位元組有8個bit位,這8個bit位可以構成2^8=256個數值,同理2位元組的共2^16=65536個數值,4位元組的int占用32bit,可以表示的範圍為0-2^32。也就是說,在0-255之間的數字都只占用乙個位元組,256-65535之間的數字需要占用兩個位元組。

需要注意,在mysql/mariadb中的整型資料型別可以使用引數m,m是乙個正整數,例如int(m),tinyint(m)。這個m表示的是顯示長度,如int(4)表示在輸出時將顯示4位整數,如果實際值的位數小於顯示值寬度,則預設使用空格填充在左邊。而結果位數超出時將不影響顯示結果。一般該功能都會配合zerofill屬性用0代替空格填充,但是使用了zerofill後,該列就會自動變成無符號字段。

此處主要說明char和varchar的儲存方式以及區別。

char型別是常被稱為"定長字串型別",它嚴格限定空間長度,但它限定的是字元數,而非位元組數,char(m)嚴格儲存m個字元,不足部分使用空格補齊,超出m個字元的部分直接截斷

由於char型別有"短了就使用空格補足"的能力,因此為了體現資料的真實性,在從位址空間中檢索資料時將自動刪除尾隨的空格部分。這正是char的乙個特殊性,即使是我們手動儲存的尾隨空格也會被認為是自動補足的,於是在檢索時被刪除。

varchar常被稱為"變長字串型別",它儲存資料時使用額外的位元組的bit位來標記某個位元組是否儲存了資料。每儲存乙個位元組(不是字元)占用乙個bit位進行記錄,因此乙個額外的位元組可以標記共256個位元組,2個額外的位元組可以標記65536個位元組。但mysql/mariadb限制了最大能儲存65536個位元組。這表示,如果是單位元組的字元,它最多能儲存65536個字元,如果是多位元組字元,如utf8的每個字元占用3個位元組,它最多能儲存65536/3=21845個utf8字元。

因此,varchar(m)儲存時除了真實資料占用空間長度,還要額外計算1或2個位元組的bit位長度,即對於單位元組字元實際占用的空間為m+1或m+2個位元組,對於多位元組字元(如3位元組)實際占用的空間為m*3+1或m*3+2個位元組。

由於varchar儲存時需要採用額外的bit位記錄每乙個位元組,短了的資料不會自動使用補齊,因此顯式儲存的尾隨空格也會被儲存並在bit位上進行標記,也就是說不會刪除尾隨空格。

和char(m)一樣,當指定varchar(2)時,只能儲存兩個位元組的字元,如果超出了,則切斷。

關於char、varchar以及text字串型別,它們在比較時不會考慮尾隨空格,但做like匹配或正則匹配時會考慮空格,因為匹配時字元是精確的。

最後需要說明的是,數值在儲存(或調入記憶體)時,以數值型方式儲存比字元型或日期時間型別更節省空間。因為整數值儲存時是直接通過bit計算數值的,0-255之間的任意整數都只佔乙個位元組,256-65535之間的任意整數都佔2個位元組,而占用4個位元組時便可以代表幾十億個整數之間的任意乙個,這顯然比字元型儲存時每個字元占用乙個位元組節省空間的多。例如值"100"儲存為字元型時占用三個位元組,而儲存為數值型將只占用乙個位元組。因此資料庫預設將不使用引號包圍的值當作數值型,如果明確要儲存為字元型或日期時間型則應該使用引號包圍以避免歧義。

unsigned屬性就是讓數值型別的資料變得無符號化。使用unsigned屬性將會改變量值資料型別的範圍,例如tinyint型別帶符號的範圍是-128到127,而使用unsigned時範圍將變成0到255。同時unsigned也會限制該列不能插入負數值。

MySQL 鎖機制 儲存引擎 資料型別

mysql常用資料型別 mysql識別符號命名規則 mysql中utf8 utf8mb4字符集的區別 關於null 資料庫本身也提供了一些鎖,按加鎖方式分為 按照讀寫許可權分為 排它鎖 共享鎖都是資料庫提供的鎖機制,直接呼叫資料庫的相關語句即可。共享鎖可能發生死鎖問題 一塊資料已經加了共享鎖,如果乙...

資料型別和儲存

在c和c 中的浮點分為float和double。這2個浮點型別的區別在於寬度,在儲存方式上沒有區別。首先需要說明一點二進位制是沒辦法表示負數的,所以負數的二進位制表示有各種規範。c和c 採用的是ieee標準,下面用乙個float的例子來說明吧 先將這個實數的絕對值化為二進位制格式 將這個二進位制格式...

mysql 儲存矩陣資料型別 MySQL 資料型別

mysql 資料型別 mysql中定義資料欄位的型別對你資料庫的優化是非常重要的。mysql支援多種型別,大致可以分為三類 數值 日期 時間和字串 字元 型別。數值型別 mysql支援所有標準sql數值資料型別。這些型別包括嚴格數值資料型別 integer smallint decimal和nume...