首頁 > 軟體

淺談Mysql tinyint(1)與tinyint(4)的區別

2023-03-21 06:00:32

引言

藉由本篇文章來探討下在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)內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com