MySQL中,int(10) 的 10 代表什么?
在 MySQL 中,我們定義int類型時需要設(shè)置長度,比如INT(10),那么10 到底代表什么?如果超過這個范圍會出現(xiàn)什么問題?這篇文章我們來詳細地聊一聊。
含義
在數(shù)據(jù)類型如 INT 后面的括號中的數(shù)字(例如 INT(10))指定了顯示寬度,即當(dāng)使用 ZEROFILL 屬性時,系統(tǒng)會在數(shù)值前補零以達到指定的寬度。
- 存儲空間:INT 數(shù)據(jù)類型總是占用 4 字節(jié)(32 位),無論顯示寬度是多少。
- 取值范圍:對于有符號的 INT,范圍是 -2147483648 到 2147483647;對于無符號的 INT UNSIGNED,范圍是 0 到 4294967295。顯示寬度不會改變這一范圍。
ZEROFILL 的應(yīng)用
當(dāng)在 INT 類型后使用 ZEROFILL 時,MySQL 會在數(shù)值前補零,以符合指定的顯示寬度。如下示例:
CREATE TABLE users (
id INT(10) ZEROFILL,
name VARCHAR(50)
);
插入數(shù)據(jù):
INSERT INTO users (id, name) VALUES (123, 'Alice');
查詢結(jié)果:
+-----------+-------+
| id | name |
+-----------+-------+
| 0000000123 | Alice |
+-----------+-------+
在這個例子中,id 字段顯示為 0000000123,達到 10 位寬度。
MySQL 8.0.17 及以后的變化
從 MySQL 8.0.17 版本開始,整數(shù)類型的顯示寬度被廢棄(deprecated),即使指定了顯示寬度,默認情況下也不再影響存儲或顯示。這意味著:
- 影響:不再推薦在整數(shù)類型后指定顯示寬度,如 INT(10) 中的 10 將被忽略,除非配合 ZEROFILL 使用。
- 推薦做法:直接使用 INT 而無需指定顯示寬度,除非確實需要與現(xiàn)有系統(tǒng)兼容或有特殊需求。
為了更好地理解INT,下面通過幾個例子詳細解釋。
創(chuàng)建表并插入數(shù)據(jù):
CREATE TABLE example (
id INT(10) NOT NULL,
name VARCHAR(50)
);
INSERT INTO example (id, name) VALUES (1, 'John'), (123456, 'Jane');
查詢顯示:
SELECT * FROM example;
結(jié)果:
+-------+-------+
| id | name |
+-------+-------+
| 1 | John |
| 123456 | Jane |
+-------+-------+
在沒有使用 ZEROFILL 的情況下,顯示寬度 10 并未影響輸出格式。
使用 ZEROFILL 的情況:
CREATE TABLE example_zf (
id INT(10) ZEROFILL NOT NULL,
name VARCHAR(50)
);
INSERT INTO example_zf (id, name) VALUES (1, 'John'), (123456, 'Jane');
SELECT * FROM example_zf;
結(jié)果:
+-----------+-------+
| id | name |
+-----------+-------+
| 0000000001 | John |
| 0000123456 | Jane |
+-----------+-------+
這里,id 字段根據(jù)顯示寬度 10 補充了前導(dǎo)零。
注意:由于 MySQL 8.0.17 及以后的版本中顯示寬度被廢棄,建議在設(shè)計數(shù)據(jù)庫時避免依賴顯示寬度,除非有明確的需求和兼容性考慮。
總結(jié)
- INT(10) 中的 10 代表的是顯示寬度,它用于在與 ZEROFILL 一起使用時補充前導(dǎo)零。
- 不影響數(shù)值的存儲大小或取值范圍。
- 在 MySQL 8.0.17 及以后版本中,整數(shù)類型的顯示寬度被廢棄,建議不再使用這種方式指定寬度,除非有特定需求。