最近在使用MySQL時,發現了一個奇怪的問題:在保存INT類型的數據后,長度從原本的10變成了11。我們可以通過以下方法來驗證這個問題。
CREATE TABLE test (id INT(10) NOT NULL);
INSERT INTO test VALUES (9999999999);
在執行完以上代碼后,我們可以通過以下代碼查看table的結構。
DESCRIBE test;
輸出結果如下:
+-------+---------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id | int(11) | NO | | NULL | |
+-------+---------+------+-----+---------+-------+
可以看到,之前設置的INT(10)變成了INT(11)。
這是因為在MySQL中,INT類型的長度指的是顯示寬度,也就是數據在顯示時占用的字符數。實際上,INT類型只有以下幾種長度:TINYINT(1 byte),SMALLINT(2 bytes),MEDIUMINT(3 bytes),INT(4 bytes),BIGINT(8 bytes)。而在我們的例子中,數字9999999999需要11個字符才能將其顯示完整,所以MySQL將其長度調整為11。
我們可以通過以下代碼驗證這一點:
CREATE TABLE test (id INT(1) NOT NULL);
INSERT INTO test VALUES (9999999999);
再次執行以上代碼,我們可以再次通過以下代碼查看table的結構。
DESCRIBE test;
此時輸出結果如下:
+-------+-----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-----------+------+-----+---------+-------+
| id | tinyint(4) | NO | | NULL | |
+-------+-----------+------+-----+---------+-------+
可以看到,雖然之前設置的是INT(1),但MySQL自動將其調整為了TINYINT(4)。
所以,在使用MySQL時,我們需要注意長度的含義,以避免在保存數據時出現錯誤。