mysql 字节 字符_MySQL字符类型存放不同字符所占字节问题确认

MySQL字符类型存放不同字符所占字节问题确认

通过官方文档可知一行最多存65535个字节。

utf-8 字符测试

1 建表  一个汉字在utf-8中占3个字节

通过计算65535/3可以得出每行最多存21845,建表

7F2FB3E674104D629ECA25EF8C81B68B

创建失败原因是varchar(N)的前两个字符是表是varchar的长度。字符为空时存储是从第二位是从第2位开始,也就是N=(65535-2-1)/3 =21844

80BC4A5000D548789C940F700668EB6A

2 插入数据比较表的字节变化

查看空表所占字节空表所占字节16384

1134D8088624407380440D39D7D7DB51

插入数据

7E9A727CEF7A4C59844ACD1E05A8705A

查看表的变化并计算(备注这是测试中插入两行后的要除2)

DD7D7879D6BF45EA8EAF956D3D6FF3A2

计算表的大小(147456-16384)/2 - 1=65535(1是表中标注1行占用的字节)

字符数查看select char_length(a1),length(a1) from tb_utf8;

13B6DECBC825478CA189FB056E21C6D6

验证验证为空和不为空时字符占用

varchar(21844) 后正好占用65533个字节tinyint类型占用一个自己65535=65532+2+1

863EE3A5692F447F982E0D83F9DC914D

varchar为空时验证

2FB5CBFB1C6E4494BC49E90A8F18A93C

可以用看出为空需要一个字节去标示,表不能创建

结论:varchar在utf-8中一个汉字占用3个字节, 数字和字母都占用一个字节。 为空需要一个字节去标示。

gbk 字符集测试

建表: 根据gbk编码一个汉字占用2个字节,一行最多有65535个字节和上边测试的为空时多占一个字节。可以计算出varchar(N)  N在 varchar在为空和非空的值

为空(65535-2-1)/2 = 32766个汉字非空 (65535-2)/2=32766.5也就是非空状态下可以多建一个tinyint类型

varchar为空建表

72FA9470B82A48E987E27D6F25378B87

varchar非空建表

214662C6A4354B0C8DF8674D47A49D21

注释:在建表时如果varchar超过规定字节数时会默认转换字符类型

AEAAA2978A8F42EA99683EF5DC3FDE3C

插入数据后查看插入数据量

BBF00DEC76D44A35B92416CBC40A1964

查看数据占用的字节

插入前表

2EA86AC2A7AB4FA3BCEEA06AC42F714E

插入后

85D08CE0A8134A0BB8534A935785EE1F

结论: 在gbk字符中varchar(N) ,N<=23766个汉字 。如果N 大于32766 mysql 会默认的转换字符类型。 gdk中能存32766个汉字或者数字字母。

latin1 字符集 测试

1character=1byte,1汉字=2character,

建表   因为在latin1 中一个字节=1个字符 ,建表时varchar(N) N 在varchar不为空的时 N=65533 为空时N=65532

9EDA02B782A640849506E383BE323EE5

分别插入字母和汉字查看插入数据结果

7CF1BAC8EC734994B9E9999D699A1D14

可以看到插入的字符和汉字情况通过计算插入汉字65523,插入汉字(65523-1)/2个汉字。

显示汉字长度不正确原因

在插入汉字是如果汉字大于varchar(n) 中(N-1)/2的值 ,N为是奇数 。插入的值为:汉字个数+1空字符汉字个数=(N-1)/2

结论 :latin1 中varchar(N) N 最多能插入65523 个字母或数字,能插入N/2 个汉字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值