标签:mysql字符集研究
通过计算65535/3 可以得出每行最多存21845,建表
创建失败 原因是varchar(N)的前两个字符是表是varchar的长度。字符为空时存储是从第二位是从第2位开始,也就是N=(65535-2-1)/3 =21845
查看空表所占字节 空表所占字节 16384
插入数据
查看表的变化并计算 (备注这是测试中插入两行后的要除2)
计算表的大小147456/2-16384-1=65535 (1 是表中标注1行占用的字节)
字符数查看 select char_length(a1),length(a1) from tb_utf8;
varchar (21844) 后正好占用65533个字节 tinyint类型占用一个自己 65535=65532+2+1
varchar 为空时验证
可以用看出为空需要一个字节去标示,表不能创建
结论: varchar 在utf-8中一个汉字占用3个字节, 数字和字母都占用一个字节。 为空需要一个字节去标示。
为空 (65535-2-1)/2 = 32766个汉字 非空 (65535-2)/2=32766.5 也就是非空状态下可以多建一个tinyint类型
varchar为空建表
varchar 非空建表
注释: 在建表时如果varchar超过规定字节数时会默认转换字符类型
查看数据占用的字节
插入前表
插入后
1character=1byte, 1汉字=2character,
可以看到插入的字符和汉字情况 通过计算插入汉字65523 ,插入汉字(65523-1)/2 个汉字。
显示汉字长度不正确原因
在插入汉字是如果汉字大于varchar(n) 中(N-1)/2 的值 ,N为 是奇数 。插入的值为:汉字个数+1空字符 汉字个数=(N-1)/2
标签:mysql字符集研究
原文地址:http://jialong.blog.51cto.com/1104441/1658457