美文网首页mysql基础实践总结系列
Mysql varchar 长度是字节还是字符

Mysql varchar 长度是字节还是字符

作者: 十年磨一剑1111 | 来源:发表于2019-08-22 15:43 被阅读0次

    关于varchar的长度是字节还是字符本人查阅很多文档发现他们写的都是字节长度,但是经过实践表明那个长度指的是能放下的字符串的个数

    varchar(255) 表示最多可以放255个字符,不论是中文还是英文。

    注:version 4版本之前是按字节

    下面再来扩展一点知识:
    在5.0以上的MySQL版本中varchar的最长的长度是65535字节,其最大长度受限于最大行长度(max row size 65535Bytes)。65535并不是一个很精确的上限,65535个字节是包括了所有字段的长度、变长字段的长度标识(每个变长字段使额外使用1个或者2个字节记录数据的实际长度)、NULL标志位的长度。下面来看下计算规则:

    1. 减去其他字段的长度,具体的计算方法要结合字段的类型来看
    2. 减去变长字段的长度标识,如果长度小于256使用1个字节存储,其他的使用2个字节存储。
    3. 减去NULL标识位,比如一张表中存在N个varchar字段,那么需要(N+7)/8 (取整) 个字节存储所有的NULL标志位。

    下面来证明下(笔者测试的版本是MySQL8.0,字符集选用的是utf8):

    mysql > show create table user2;
    | user2 | CREATE TABLE `user2` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `username` varchar(21811) NOT NULL DEFAULT '',
      `pwd` char(32) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='用户表'    |
    

    其中username这个字段的长度21811是能设置的最大长度,如果再大就会报错,(65535-4-2-32 * 3) / 3 = 21811 个字符。
    a. 其中 id int 型占用4个字节,
    b. username 字段长度标识2个字节,由于是NOT NULL 所以没有NULL标识位。
    c. pwd 字段占用32*3个字节,由于是NOT NULL 也不占用NULL标识位。
    不过需要注意的是:不同的字符集每个字符使用的字节数是不一样的。另外,如果插入数据的时候数据的长度大于定义的长度默认是会报错的。

    相关文章

      网友评论

        本文标题:Mysql varchar 长度是字节还是字符

        本文链接:https://www.haomeiwen.com/subject/lhinsctx.html