utf8編碼的varchar
Mysql記錄行數據是有限的。大小為64k,即65535個字節,而varchar要用1-2字節來存儲字段長度,小於255的1字節,大於255的2字節。
Mysql 5.0后,英文字符固定都是一個字節,漢字字符根據編碼方式占不同字節,Utf-8占3個字節,gbk占了2個字節。
第一,當編碼方式為utf-8時,varchar存到21845就存不下了.也就是最大長度是21844.根據上面信息可以推算出 ( 65535-2 )/3=21844余1
例子如下:
GBK編碼的varchar
當編碼格式為GBK時,varchar能存多少字符呢?經過推理可知大約能存32766個字符,(65535-2)/2=32766余1。
那么看看實驗結果如下:
為何提出這個問題?
前段時間一個哥們提bug,要把備注等字段全部最大大小設置為1000,甚至更多,這個表的字段本身就已經很多了,而我們設計表時一般都默認使用utf8這個編碼格式,那么一個漢字就占了3個字節,故一個行記錄的長度就會短了些,數據占用存儲資源也會多了些,然后修改的時候成功的報了row size too large的這個錯誤。這里提出來也是為了讓大家注意下。
總結
設計表的時候不同的編碼格式會導致varchar的最大值發生變化,varchar(數值),這個數值指的是字符數,也可以說是一個字,但是不是字節,當然存儲的數據還是一個英文占一個字節,一個漢字根據編碼格式占不同字節。