萬答#11,MySQL中char與varchar有什麼區別
萬答#11,MySQL中char與varchar有什麼區別
1.實驗場景
GreatSQL 8.0.25 InnoDB
2.實驗測試
2.1 區別
引數 | char | varchar |
---|---|---|
長度是否可變 | 定長 | 變長 |
儲存容量 | 0 ~ 255 | 0 ~ 65,535 |
2.2 建測試表
CREATE TABLE vc (v VARCHAR(4), c CHAR(4));
2.3 未超出設定值測試
欄位V、C都寫入一個4+空格的字元
[root@GreatSQL][test]> INSERT INTO vc VALUES ('4 ', '4 '); [root@GreatSQL][test]> SELECT CONCAT('(', v, ')'), CONCAT('(', c, ')') FROM vc; +---------------------+---------------------+ | CONCAT('(', v, ')') | CONCAT('(', c, ')') | +---------------------+---------------------+ | (4 ) | (4) | +---------------------+---------------------+ 1 rows in set (0.00 sec)
測試結果,char的長度維持不變,佔了2個字元,varchar空格長度變了,佔了一個字元。
2.4 超出設定值測試
當寫入長度大於設定長度時候,出現報錯
[root@GreatSQL][test]>INSERT INTO vc VALUES ('123456', '123456');
ERROR 1406 (22001): Data too long for column 'v' at row 1
調整sql_mode,再寫入的時候,自動擷取限制容量內的內容
[root@GreatSQL][test]>set session sql_mode="ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" [root@GreatSQL][test]>INSERT INTO vc VALUES ('123456', '123456'); Query OK, 1 row affected, 2 warnings (0.02 sec) [root@GreatSQL][test]>select * from vc; +------+------+ | v | c | +------+------+ | 1234 | 1234 | +------+------+ 1 row in set (0.00 sec)
2.5 欄位長度測試
建立表,設定CHAR長度為256, 結果提示錯誤
[root@GreatSQL][test]>CREATE TABLE vc (v VARCHAR(255), c CHAR(256));
ERROR 1074 (42000): Column length too big for column 'c' (max = 255); use BLOB or TEXT instead
3.使用建議
- 頻繁改動的欄位型別建議使用char。
- 基本不會變動的欄位型別建議使用varchar型別,這樣可以節省一些儲存空間。
- 如果需要建立索引那麼也建議使用char型別,因為char型別能有效避免因欄位變化而產生的索引碎片,提高索引效能。
更多細節請參閱官網:
https://dev.mysql.com/doc/refman/8.0/en/char.html
文章推薦:
技術分享 | MGR最佳實踐(MGR Best Practice)
https://mp.weixin.qq.com/s/66u5K7a9u8GcE2KPn4kCaA
技術分享 | 萬里資料庫MGR Bug修復之路
https://mp.weixin.qq.com/s/IavpeP93haOKVBt7eO8luQ
Macos系統編譯percona及部分函式在Macos系統上運算差異
https://mp.weixin.qq.com/s/jAbwicbRc1nQ0f2cIa_2nQ
技術分享 | 利用systemd管理MySQL單機多例項
https://mp.weixin.qq.com/s/iJjXwd0z1a6isUJtuAAHtQ
產品 | GreatSQL,打造更好的MGR生態
https://mp.weixin.qq.com/s/ByAjPOwHIwEPFtwC5jA28Q
產品 | GreatSQL MGR優化參考
https://mp.weixin.qq.com/s/5mL_ERRIjpdOuONian8_Ow
關於 GreatSQL
GreatSQL是由萬里資料庫維護的MySQL分支,專注於提升MGR可靠性及效能,支援InnoDB並行查詢特性,是適用於金融級應用的MySQL分支版本。
Gitee:
https://gitee.com/GreatSQL/GreatSQL
GitHub:
https://github.com/GreatSQL/GreatSQL
微信&QQ群:
可掃碼新增GreatSQL社群助手微信好友,傳送驗證資訊“加群”加入GreatSQL/MGR交流微信群,亦可直接掃碼加入GreatSQL/MGR交流QQ群。
本文由部落格一文多發平臺 OpenWrite 釋出!