做数据库设计,偶然间研究了一下varchar 和char 这两个东东 对于我这种渣渣连二进制字节都不懂的人理解起来还挺费劲,不过功夫不负有心人 理论上的知识从网上看的翻看了好多文章有的文章真是误人子弟,先说一下核心的在带点理论 ,核心的是我亲自试验出来的
mysql中varchar(255)括号中的255代表限制长度255个字节 这个()中如果是utff8 编码的 最多可以写为21843(不能为空) 可以存21843个中文数字英文符号 这个是这么计算的 允许最大长度为65535但是utf8就要÷3,因为utf8一个字符占3个字节, 得到21845 当长度设置超过255 mysql要用2个字符长度来作为标识,那么小于等于255也就不用研究最大值了, 所以要减去2 有的文章里写65535-2÷3貌似是不对反正我测试的是utf8编码应该是减去3个字符长度而不是3个字节长度 所以应该是先除以3再减去2 得到21843 有可能你写到括号中的时候会报错.这时一句骗子脱口而出,我就丢大人了.这时报错因为mysql中海油一个设置是 如果你允许为空 又要减去一个字符那么你只能填21842. 那么还要考虑一个问题 就是比如要是还想设置char(5)那么你还要在21843的基础上-5才能设置charr(5) 因为他是按照整行计算的 同理你再设置varchar和char也要相对减少数值才可以
那么这里的char(5)和varchar(10)指什么呢? varchar就是你可以最多存入英文,数字中文标点符号空格加起来10个 char(5) 是你可以最多存入英文,数字中文标点符号空格加起来5个 但是不管你存入几个 他还是占用5个字符长度 虽然你用select语句查询他也是只显示你存入的东东 那么char()括号中最大可以写255要选择无符号 如果有符号则取值范围是-127到127
php中的strlen计算的是字节长度不是字符长度,utf下计算一个中文为3英文数字各为1 用mb_strlen函数计算相对编码格式下的字符长度 utf下计算一个中文英文数字各为1