⼀篇⽂章看懂mysql中varchar能存多少汉字、数字,以及
varchar(100)和v。。。
看完这篇⽂章,你能搞清楚以下问题:
1、varchar(100)和varchar(10)的区别在哪⾥?
2、varchar能存多少汉字、数字?
3、varchar的最⼤长度是多少呢?
4、字符、字节、位,之间的关系?
5、mysql字段类型存储需要多少字节?
接下来请仔细看,整理不易啊。
1、varchar(100)和varchar(10)的区别在哪⾥?
所以如果某些字段会涉及到⽂件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太
过于慷慨。还是要评估实际需要的长度,然后选择⼀个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,⽽随意的分配长度,或者说⼲脆使⽤最⼤的字符长度。
----------------------------------char------------------------------------------
1、从碎⽚⾓度进⾏考虑,使⽤CHAR字符型时,由于存储空间都是⼀次性分配的。为此某个字段的内容,其都是存储在⼀起的。单从这个⾓度来讲,其不存在碎⽚的困扰。⽽可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不⼀致时,就不可避免的会出现碎⽚的问题。故使⽤可变长度的字符型数据时,数据库管理员要时不时的对碎⽚进⾏整理。如执⾏数据库导出导⼊作业,来消除碎⽚。
2、考虑其长度的是否相近,如果某个字段其长度虽然⽐较长,但是其长度总是近似的,如⼀般在90个到100个字符之间,甚⾄是相同的长度。此时⽐较适合采⽤CHAR字符类型。⽐较典型的应⽤就是MD5哈希值。当利⽤MD5哈希值来存储⽤户密码时,就⾮常使⽤采⽤CHAR字符类型。因为其长度是相同的。另外,像⽤来存储⽤户的⾝份证号码等等,⼀般也建议使⽤CHAR类型的数据。
另外请⼤家考虑⼀个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够⽤来保存单个的字符,但是VARCHAR要⽐CHAR多占⽤⼀个存储位置。这主要是因为使⽤VARCHA
R数据类型时,会多⽤1个字节⽤来存储长度信息。这个管理上的开销char字符类型是没有的。
---------------------------------总结---------------------------------------------
⼆者在磁盘上存储占的空间是⼀样的。区别有⼆。第⼀、⼀个变长⼀个固定长度。第⼆、在内存中的操作⽅式,varchar也是按照最长的⽅式在内存中进⾏操作的。⽐如说要进⾏排序的时候,varcahr(100)是按照100这个长度来进⾏的。
2、varchar能存多少汉字、数字?
具体还是要看版本的,⼀个字符占⽤3个字节,⼀个汉字(包括数字)占⽤3个字节=⼀个字符
4.0版本以下,varchar(100),指的是100字节,如果存放UTF8汉字时,只能存33个(每个汉字3字节)
varchar2最大长度5.0版本以上,varchar(100),指的是100字符,⽆论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放100个。
UTF8编码中⼀个汉字(包括数字)占⽤3个字节
GBK编码中⼀个汉字(包括数字)占⽤2个字节
3、varchar的最⼤长度是多少呢?
mysql的vachar字段的类型虽然最⼤长度是65535,但是并不是能存这么多数据,最⼤可以到65533,其中需要1到2个字节来存储数据长度(如果列声明的长度超过255,则使⽤两个字节来存储长度,否则1个)字节,当不允许⾮空字段的时候(因为要⽤⼀个字节来存储不可为空的标识),当允许⾮空字段的时候只能到65532(省下了存储⾮空的那个字节)。
字段⾮空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) - 1 (null byte)=65531 字节可以⽤
减1的原因是实际⾏存储从第⼆个字节开始';
字段可以空时候:varchar(65535) -2 bytes (存储长度,按2个算) - 1byte (latin1类型) =65532 字节可以⽤
根据这个最⼤字节数,以及编码⽅式,可以计算能存储的汉字数。
4、字符、字节、位,之间的关系?
1、位:
数据存储的最⼩单位。每个⼆进制数字0或者1就是1个位;
2、字节:
8个位构成⼀个字节;
即:1 byte (字节)= 8 bit(位);
1 KB = 1024 B(字节);
1 MB = 1024 KB;  (2^10 B)
1 GB = 1024 MB;  (2^20 B)
1 TB = 1024 GB;  (2^30 B)
3、字符:
a、A、中、+、*、の......均表⽰⼀个字符;
⼀般 utf-8 编码下,⼀个汉字字符占⽤ 3 个字节;数字属于汉字,和汉字占⽤⼀样字节。⼀般 gbk 编码下,⼀个汉字字符占⽤ 2 个字节;
5、mysql字段类型存储需要多少字节?
数字类型
列类型需要的存储量
TINYINT  1 字节
SMALLINT  2 个字节
MEDIUMINT  3 个字节
INT  4 个字节
INTEGER  4 个字节
BIGINT8 个字节
FLOAT(X)  4 如果 X < = 24 或 8 如果 25 < = X < = 53
FLOAT  4 个字节
DOUBLE8 个字节
DOUBLE PRECISION8 个字节
REAL8 个字节
DECIMAL(M,D)M字节(D+2 , 如果M < D)
NUMERIC(M,D)M字节(D+2 , 如果M < D)
⽇期和时间类型
列类型需要的存储量
DATE  3 个字节
DATETIME8 个字节
TIMESTAMP4 个字节
TIME  3 个字节
YEAR  1 字节
串类型
列类型需要的存储量
CHAR(M)M字节,1 <= M <= 255
VARCHAR(M)L+1 字节, 在此L <= M和1 <= M <= 255
TINYBLOB, TINYTEXT L+1 字节, 在此L< 2 ^ 8
BLOB, TEXT L+2 字节, 在此L< 2 ^ 16
MEDIUMBLOB, MEDIUMTEXT L+3 字节, 在此L< 2 ^ 24
LONGBLOB, LONGTEXT L+4 字节, 在此L< 2 ^ 32
ENUM('value1','value2',...)  1 或 2 个字节, 取决于枚举值的数⽬(最⼤值65535)
1,2,3,4或8个字节, 取决于集合成员的数量(最多64个成员)text与blob的区别在于:text不能存储图⽚。blob是⼆进制流,text是⾮⼆进制。
mysql 的⼆进制数据类型 BINARY, VARBINARY, BLOB 都没有字符集的概念。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。