MySQL VARCHAR存儲大小

經常有開發在問建表語句的時候varchar字段的長度大小。或者建表語句中的字段varchar是亂寫的。比如直接寫個varchar(50000)。今天統一總結下:


提示:VARCHAR(N) 指的是可以存放的最大字符個數,不是字節數。
需要區分字符和字節。一個漢字,一個數字,一個字母都是一個字符。
字節是計算機的基礎存儲單元,8位一個字節。 具體區分可以查看 字符,字節和編碼


因爲VARCHAR列中的值爲可變長字符串。長度可以指定爲0到65,535之間的值。(VARCHAR的最大有效長度由最大行大小和使用的字符集確定。整體最大長度是65,532字節)。所以不同字符集對應的varchar可以支持的最大長度是不一樣的。
字符類型若爲gbk,每個字符最多佔2個字節,最大長度不能超過32766;
字符類型若爲utf8,每個字符最多佔3個字節,最大長度不能超過21845。
若定義的時候超過上述限制,則varchar字段會被強行轉爲text類型,併產生warning。


實踐出真知:
表結構如下:
 CREATE TABLE `test2` (
  `a` int(11) NOT NULL,
  `b` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 


插入數據:
mysql> insert into test2 values (1,'a');
Query OK, 1 row affected (0.04 sec)
mysql> insert into test2 values (2,'aa');
Query OK, 1 row affected (0.01 sec)


mysql> insert into test2 values (3,'aaa');
Query OK, 1 row affected (0.04 sec)


mysql> insert into test2 values (4,'aaaa');
Query OK, 1 row affected (0.08 sec)
mysql> insert into test2 values (5,'aaaaa');
Query OK, 1 row affected, 1 warning (0.04 sec)    //超過字段設定的最大長度,會出現警告,這個跟你設置的庫SQL服務器模式有關係,也會報錯。 出現警告後自動的截取最大長度的字符串


mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+




mysql> insert into test2 values (6,'te111');  //可以看到的是存儲的是字符個數,而不是字節數
Query OK, 1 row affected, 1 warning (0.03 sec)


mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+


查詢結果:
mysql> select * from test2;
+---+------+
| a | b    |
+---+------+
| 1 | a    |
| 2 | aa   |
| 3 | aaa  |
| 4 | aaaa |
| 5 | aaaa |
| 6 | te11 |
+---+------+


mysql>   CREATE TABLE `test3` (                   
    ->           `var` varchar(21845) default NULL   
    ->         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    -> ;
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章