背景:在大佬強烈要求下,整理了一下商品總表goods
,發現有個簡介description
的字段使用text類型,大佬強烈要求想改爲varchar類型,但因爲歷史緣由,有些類型的商品簡介這個字段存的是後臺的富文本編輯框內容,查了一下最大長度,有6萬多一點(字符數/字數,不是字節數)。函數
後來網上查了一下,varchar類型能夠存儲的字節和TEXT都是65535個字節。測試
問題:是否是就是說只要設置varchar(65535)就至關於設置了text類型呢?編碼
答案:??3d
接下來就本身測試了一番。code
測試版本:5.6cdn
首先,我建立了一個表,==編碼爲UTF8==。新增text字段,往字段內填充內容,中英文亂七八糟的,結果發現,text確實能夠最大字節數爲65535(將使用PHP的函數strlen()計算獲得長度爲65535的數據填充進去剛恰好)。blog
而後,刪除text字段,新增varchar字段,發現根本不能設置長度爲65535,==最大隻能設置爲21844,便可以存儲包括中英文符號等在內的全部字符數量之和爲21844==(將使用PHP的函數mb_strlen()計算獲得長度爲21844的數據填充進去剛恰好)。ip
緣由:由於UTF8編碼按每一個字符最多要佔用三個字節數計算,65535/3=21845,又由於varchar自己要佔用一個字節(這裏我不肯定utf8編碼是否要佔用三個字節,仍是佔用了一個字節剩下兩個字節湊不夠一個字符),因此少了一個字符數量。it
其實,所謂的varchar類型能夠存儲65535個字節,是對於MySQL表的行大小的限制爲65535個字節。==即每張表全部字段長度加起來的總字節數不能大於65535個字節。==io
如今,我再去新增一個字段,int類型,發現建立失敗!!
提示以下錯誤:
緣由:int類型要佔用表的一個字符數,可是varchar字段已經使用了MySQL行最大限制上限,因此致使新增字段失敗。
接着,我隨意新增字段,並有意減小varchar字段長度,作最大上限測試。
得出如下結論:
==根據建立表的編碼類型,不一樣的類型須要佔用的字符數不一樣==,UTF8編碼下:
最後回顧一下問題:
是否是就是說只要設置varchar(65535)就至關於設置了text類型呢?
答案:錯誤的!!
varchar類型存儲長度與表的編碼有關係。
當我嘗試新建一個表,編碼爲單字節字符集latin1類型,最終能夠設置的最大長度以下(也達不到65535):
因此,得出結論:當下我這個goods
表中的description
字段沒法修改類型爲varchar。
緣由:①utf8編碼下,長度不夠;②這個字段長度設置過大,會致使容易達到表的行最大限制長度,這個問題會致使新增字段都新增不了!!!