1.1 數(shù)據(jù)類型概覽
數(shù)據(jù)類型算是一種字段約束,它限制每個字段能存儲什么樣的數(shù)據(jù)、能存儲多少數(shù)據(jù)、能存儲的格式等。MySQL/MariaDB大致有5類數(shù)據(jù)類型,分別是:整形、浮點型、字符串類型、日期時間型以及特殊的ENUM和SET類型。
這5種數(shù)據(jù)類型的意義、限制和相關(guān)說明如下圖所示:

各數(shù)據(jù)類型占用字節(jié)數(shù),參見mariadb官方手冊。
1.2 存儲機(jī)制和操作方式
數(shù)據(jù)類型之所以能限定字段的數(shù)據(jù)存儲長度,是因為在創(chuàng)建表時在內(nèi)存中嚴(yán)格劃定了地址空間,地址空間的長度是多少就能存儲多少字節(jié)的數(shù)據(jù)。當(dāng)然,這是一個很粗獷的概念,更具體的存儲方式見下面的描述。
數(shù)據(jù)類型限定范圍的方式有兩種:一是嚴(yán)格限定空間,劃分了多少空間就只能存儲多少數(shù)據(jù),超出的數(shù)據(jù)將被切斷;二是使用額外的字節(jié)的bit位來標(biāo)記某個地址空間的字節(jié)是否存儲了數(shù)據(jù),存儲了就進(jìn)行標(biāo)記,不存儲就不標(biāo)記。
1.2.1 整型的存儲方式
此處主要說明整型的存儲方式,至于浮點型數(shù)據(jù)類型的存儲方式要考慮的東西太多。
對于整型數(shù)據(jù)類型來說,它嚴(yán)格限定空間,但它和字符不同,因為每個已劃分的字節(jié)上的bit位上的0和1直接可以計算出數(shù)值,所以它的范圍是根據(jù)bit位的數(shù)量值來計算的。一個字節(jié)有8個Bit位,這8個bit位可以構(gòu)成2^8=256個數(shù)值,同理2字節(jié)的共2^16=65536個數(shù)值,4字節(jié)的int占用32bit,可以表示的范圍為0-2^32。也就是說,在0-255之間的數(shù)字都只占用一個字節(jié),256-65535之間的數(shù)字需要占用兩個字節(jié)。
需要注意,在MySQL/mariadb中的整型數(shù)據(jù)類型可以使用參數(shù)M,M是一個正整數(shù),例如INT(M),tinyint(M)。這個M表示的是顯示長度,如int(4)表示在輸出時將顯示4位整數(shù),如果實際值的位數(shù)小于顯示值寬度,則默認(rèn)使用空格填充在左邊。而結(jié)果位數(shù)超出時將不影響顯示結(jié)果。一般該功能都會配合zerofill屬性用0代替空格填充,但是使用了zerofill后,該列就會自動變成無符號字段。例如:
| CREATE TABLE test3(id INT(2) ZEROFILL NOT NULL);INSERT INTO test3 VALUES(1),(2),(11),(111);SELECT id FROM test3;+-----+| id |+-----+| 01 || 02 || 11 || 111 |+-----+4 rows in set (0.00 sec) |
唯一需要注意的是,顯示寬度僅僅影響顯示效果,不影響存儲、比較、長度計算等等任何操作。
1.2.2 字符類型的存儲方式
此處主要說明char和varchar的存儲方式以及區(qū)別。
char類型是常被稱為"定長字符串類型",它嚴(yán)格限定空間長度,但它限定的是字符數(shù),而非字節(jié)數(shù),但以前老版本中限定的是字節(jié)數(shù)。因此char(M)嚴(yán)格存儲M個字符,不足部分使用空格補(bǔ)齊,超出M個字符的部分直接截斷。
新聞熱點
疑難解答
圖片精選