MySQL中的varchar是一種用于存儲字符串的數據類型,相比于char類型,它可以根據實際需求動態分配空間,具有更好的空間利用率。當varchar的長度達到21845時,會出現一些問題。
為什么會出現問題呢?因為在使用varchar時,它會根據實際存儲的數據來動態分配空間,但是當長度達到21845時,它需要占用3個字節來存儲長度信息。所以,當一個varchar字段長度為21845時,實際能夠存儲的字符數只有21842。
CREATE TABLE test( id INT PRIMARY KEY, name VARCHAR(21845) NOT NULL );
在創建以上表時,如果插入字符數小于等于21842的字符串,沒有任何問題。但是,如果插入字符數為21843或者更多的字符串,MySQL會報錯。錯誤信息類似于:
Error Code: 1118. Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs
這就是因為插入長度大于21842的字符串時,varchar字段需要額外占用3個字節存儲長度信息,加上其他的頭信息和行數據,導致該行數據大小超過了MySQL允許的最大行大小(默認為65535)。
所以,當需要存儲較長的字符串時,應該使用TEXT或者MEDIUMTEXT類型的字段。如果一定要使用varchar類型,需要特別注意長度問題,確保不會超過21842個字符。