1. 程式人生 > 其它 >萬答#11,MySQL中char與varchar有什麼區別

萬答#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 釋出!