淺談Mysql tinyint(1)與tinyint(4)的區別
引言
借由本篇文章來探討下在Mysql數據庫中數值類型tinyint(1)和tinyint(4) 有啥區別呢?
什麼是tinyint(M)?
先來瞭解下mysql中字符串類型varchar(M) 和數值類型tinyint(M) 的區別?
字符串列類型: varchar(M) 而言,M 是字段中可以存儲的最大字符長度,也就是說是字段長度。根據設置,當你插入超出字段長度的數據時,你很可能會收到錯誤提示,即使沒有收到錯誤提示,你插入的數據也會被自動截斷以適應該字段的預定義長度。所以,varchar(20) 和 varchar(40) 是不同的,其真實反映瞭該字段可以存儲的數據長度。
數值列類型:其長度修飾符表示最大顯示寬度,與該字段物理存儲沒有任何關系。也就是說,tinyint(1) 和 tinyint(4) 能夠存儲的數值范圍都是-128…127 (or for unsigned values 0…255),他們是相同的數據類型,當然他們還是有一點差異,以下會有說明。
對於 tinyint 數據類型,隻占 1 個字節:
– 無符號的(unsigned),范圍是 0 到 255,默認長度是 3。
– 有符號的(signed),范圍是 -128 到 127,默認長度是 4。
范圍算法:tinyint占1個字節,一個字節 8 位,也就是1*8=8,可以表示的數字個數是 2的 8 次方(2^8 = 256個數字)。
區別:若使用瞭 zerofill,當實際長度達不到指定的顯示長度時,就會用 0 在前面補齊。(簡記zerofill作用就是補零)
測試
先創建一張測試表,對 tinyint 類型都使用 zerofill。
CREATE TABLE `pre_demo` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵', `unsigned_t` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000', `signed_t` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000', `t1` tinyint(1) unsigned zerofill NOT NULL DEFAULT '0', `t2` tinyint(2) unsigned zerofill NOT NULL DEFAULT '00', `t3` tinyint(3) unsigned zerofill NOT NULL DEFAULT '000', `t4` tinyint(4) unsigned zerofill NOT NULL DEFAULT '0000', `t5` tinyint(5) unsigned zerofill NOT NULL DEFAULT '00000', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
然後,插入測試數據。
NSERT INTO pre_demo VALUES(NULL,8,8,8,8,8,8,8); INSERT INTO pre_demo VALUES(NULL,123,123,123,123,123,123,123);
最後,查詢數據表中的數據。
mysql> SELECT * FROM pre_demo; +----+------------+----------+-----+-----+-----+------+-------+ | id | unsigned_t | signed_t | t1 | t2 | t3 | t4 | t5 | +----+------------+----------+-----+-----+-----+------+-------+ | 1 | 008 | 0008 | 8 | 08 | 008 | 0008 | 00008 | | 2 | 123 | 0123 | 123 | 123 | 123 | 0123 | 00123 | +----+------------+----------+-----+-----+-----+------+-------+ 2 rows in set (0.00 sec)
mysql> SELECT *,LENGTH(id),LENGTH(unsigned_t),LENGTH(t1) FROM pre_demo; +----+------------+----------+-----+-----+-----+------+-------+------------+--------------------+------------+ | id | unsigned_t | signed_t | t1 | t2 | t3 | t4 | t5 | LENGTH(id) | LENGTH(unsigned_t) | LENGTH(t1) | +----+------------+----------+-----+-----+-----+------+-------+------------+--------------------+------------+ | 1 | 008 | 0008 | 8 | 08 | 008 | 0008 | 00008 | 1 | 3 | 1 | | 2 | 123 | 0123 | 123 | 123 | 123 | 0123 | 00123 | 1 | 3 | 3 | +----+------------+----------+-----+-----+-----+------+-------+------------+--------------------+------------+ 2 rows in set (0.00 sec)
總結
- tinyint(1) 與 tinyint(4) 能夠存儲的數據范圍是一樣的,都是 0 到 255(無符號的)。區別在於,當使用 zerofill 時,查詢結果顯示的長度可能不同。
- zerofill 和 指定長度配合使用,可用於統一數據的顯示長度,比如在數據庫層面快速生成統一長度的流水號。
- 一般情況下,無須刻意指定整型數據類型的長度。使用 MySQL 的默認長度tinyint(4) 即可。
參考文獻
http://blog.darkmi.com/2016/06/24/3110.html
https://blog.csdn.net/lamp_yang_3533/article/details/100061678
到此這篇關於淺談Mysql tinyint(1)與tinyint(4)的區別的文章就介紹到這瞭,更多相關Mysql tinyint(1)與tinyint(4)內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- MySQL中int (10) 和 int (11) 的區別
- Mysql中tinyint(1)和tinyint(4)的區別詳析
- mysql中整數數據類型tinyint詳解
- MySql數據類型教程示例詳解
- mysql中int(3)和int(10)的數值范圍是否相同