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
  例子如下:
  aaa

   aaa

GBK编码的varchar

  当编码格式为GBK时,varchar能存多少字符呢?经过推理可知大约能存32766个字符,(65535-2)/2=32766余1。
  那么看看实验结果如下:
 aaa

   aaa

为何提出这个问题?

  前段时间一个哥们提bug,要把备注等字段全部最大大小设置为1000,甚至更多,这个表的字段本身就已经很多了,而我们设计表时一般都默认使用utf8这个编码格式,那么一个汉字就占了3个字节,故一个行记录的长度就会短了些,数据占用存储资源也会多了些,然后修改的时候成功的报了row size too large的这个错误。这里提出来也是为了让大家注意下。

总结

  设计表的时候不同的编码格式会导致varchar的最大值发生变化,varchar(数值),这个数值指的是字符数,也可以说是一个字,但是不是字节,当然存储的数据还是一个英文占一个字节,一个汉字根据编码格式占不同字节。varchar(255)需要一个自己记录字段的长度 ,256以上需要两个字节记录长度。

VARCHAR的长度标识位

长度标识位是相对比较复杂的,网上的介绍错的很多,也容易算错。

其作用是记录数据的字节数

存储开销是小于255只要1字节、大于255后使用两字节。是因为按照可能的数据大小,分为0 - 255(28)、256 - 65535(216),刚好对应1字节和2字节。

但要注意,其计算根据的是字段声明的字符长度、计算可能的字节数,再决定长度标志的字节数。如VARCHAR(100),字符集为UTF8,可能的字节数为300,长度标识则为2字节。这是网上介绍错的最多的。

另外长度标志位只是存储开销,不影响占用声明的字符长度。声明的字符长度的是数据的字符数,允许的最大字符数与字符集有关。

VARCHAR(1)为例,可以存1个字符,MySQL会额外找一个字节存放长度标识

https://learn.blog.csdn.net/article/details/103341778 

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐