Mysql 中各类型数据的的存储需求
2010-12-06 13:15
197 查看
首先,数据库中每行最大长度不能超过65535bytes,其中Blob和Text的数据只占用9到12byte(具体大小不知道和什么有关系)。
Char(M)的长度计算比较简单,但也要详细说一下,M是字符的个数(不能超过255),而不是byte数,因此它的实际存储容量和它所使用的字符集有关系,对于像utf8这样的字符集(每个字符没有固定的长度),他的容量V应该如何计算?这里简单的V = M * w,其中w是字符集中每个字符占用的最大byte数,对于utf8应该是3吧,我原来猜测既然像char(4)这样的数据最大能容纳4*3bytes(对于utf8字符集),那么他肯定能容纳’123456’这段数据,因为他用utf8字符集表示也不过占用6bytes。但是实际测试后发现不是,不管是数字还是字母或者汉字,他最多只能容纳4个。
然后我们重点关注一下varchar(M)的长度,因为它的长度很不固定而且使用范围最广。这里的M的范围理论上限制在0到65535之间,为什么说理论上,是因为它的实际长度要受很多因素的限制,比如每行最大长度,使用的字符集,以及M。我们拿 varchar(127)来作为例子,假设他使用gbk字符集,他的最大可能长度应该是127*2=254,但是因为他需要有一个prefix来表示他具体bytes数是多少(因为varchar是变长的,没有这个长度值他不知道如何读取数据),因此分配1byte来表示他的bytes数为254,这样他最终占用的byte数为255,如果是varchar(128),2*128 = 256这个数字用一个byte无法表示,因此需要2个byte的prefix,这样他会占用258bytes。而如果他改使用latin1字符集,那么每个字符为1个字节,这样它的最大可能长度为1* 128 < 256,可以用一个byte表示它的长度,因此他又占用129bytes。
这里的M最大能是多少呢?对于latin1的字符,因为每个字符占一个字节,而max row size 为65535,所以M最大为65535-2 = 65533(2是prefix的长度,这个65535其实还和这一行中其他列的长度有关,准确的说应该是65535减去其他列的长度,但这里简单将他们忽略)。而如果使用utf8字符,字符最大占用3个字节,那么M最大应该是(65535 – 2)/3 = 21844,这里的2是prefix的长度。
对于某些数据库引擎,他的数据存取空间大小还需要考虑align的情况,比如计算的大小是15,但他的align = 4,所以它最后会占用16bytes。
Char(M)的长度计算比较简单,但也要详细说一下,M是字符的个数(不能超过255),而不是byte数,因此它的实际存储容量和它所使用的字符集有关系,对于像utf8这样的字符集(每个字符没有固定的长度),他的容量V应该如何计算?这里简单的V = M * w,其中w是字符集中每个字符占用的最大byte数,对于utf8应该是3吧,我原来猜测既然像char(4)这样的数据最大能容纳4*3bytes(对于utf8字符集),那么他肯定能容纳’123456’这段数据,因为他用utf8字符集表示也不过占用6bytes。但是实际测试后发现不是,不管是数字还是字母或者汉字,他最多只能容纳4个。
然后我们重点关注一下varchar(M)的长度,因为它的长度很不固定而且使用范围最广。这里的M的范围理论上限制在0到65535之间,为什么说理论上,是因为它的实际长度要受很多因素的限制,比如每行最大长度,使用的字符集,以及M。我们拿 varchar(127)来作为例子,假设他使用gbk字符集,他的最大可能长度应该是127*2=254,但是因为他需要有一个prefix来表示他具体bytes数是多少(因为varchar是变长的,没有这个长度值他不知道如何读取数据),因此分配1byte来表示他的bytes数为254,这样他最终占用的byte数为255,如果是varchar(128),2*128 = 256这个数字用一个byte无法表示,因此需要2个byte的prefix,这样他会占用258bytes。而如果他改使用latin1字符集,那么每个字符为1个字节,这样它的最大可能长度为1* 128 < 256,可以用一个byte表示它的长度,因此他又占用129bytes。
这里的M最大能是多少呢?对于latin1的字符,因为每个字符占一个字节,而max row size 为65535,所以M最大为65535-2 = 65533(2是prefix的长度,这个65535其实还和这一行中其他列的长度有关,准确的说应该是65535减去其他列的长度,但这里简单将他们忽略)。而如果使用utf8字符,字符最大占用3个字节,那么M最大应该是(65535 – 2)/3 = 21844,这里的2是prefix的长度。
对于某些数据库引擎,他的数据存取空间大小还需要考虑align的情况,比如计算的大小是15,但他的align = 4,所以它最后会占用16bytes。
相关文章推荐
- MySQL基础教程4 —— 数据类型之存储需求及如何选择正确的类型
- MYSQL存储过程循环遍历插入数据
- MySQL动态创建表,数据分表的存储过程
- MySQL更改数据库数据存储目录
- 向MySQL 中存储二进制数据文件
- Mysql MYISAM存储引擎 数据存储结构
- 爬取微博图片数据存到Mysql中遇到的各种坑\mysql存储图片\爬取微博图片
- Mysql 切换数据存储目录的实现方法
- Mysql大数据量存储及访问的设计讨论
- mysql大数据量且多存储引擎场景下的完整+增量自动异地备份的可靠方案
- 一步一步学MySQL----3 MySQL中的存储引擎和数据类型
- php表单动态数量的数据的提交以及mysql存储
- Mysql大数据量存储及访问的设计讨论-设计
- Unity3D -- 使用数据库MySQL(数据存储之二)
- mysql存储过程对900w数据进行操作测试
- mysql数据表存储路径,安装路径
- mysql数据量很大时两种不同存储过程
- mysql 存储过程判断重复的不插入数据
- MySQL修改数据表存储引擎的3种方法介绍
- Nutch的配置(使用MySQL作为数据存储)