[转载]MySQL 中 char 与 varchar 能存多少汉字问题_-Chaz-_新浪博客

char是一种固定长度的类型,varchar则是一种可变长度的类型。
 其区别在于:
 chchar(M)类型的数据列里,每个值都占用M个字节,如果长度小于M,MySQL就会在它的右边用空格字符来填补空缺.
 而vvarchar(M)类型的数据列里,每个值只占用刚好够用的字节再加上1个或者2个用来记录其长度的字节
(即总长度为L+1字节或者是 L+2字节,长度超过255时需要2个字节),因此最大长度不能超过65535。

请注意: 在mysql里

4.0版本以下varchar(5),指的是5字节,如果存放UTF8汉字时,只能存1个(每个汉字3字节)
5.0版本以上varchar(5),指的是5字符,无论存放的是数字 ,字母还是UTF8汉字(每个汉字3字节)都可以存放5个,最大大小是65532字节

在MySQL中用来判断是否需要进行对据列类型转换的规则
 
1、在一张数据表里,如果每一个数据列的长度都是固定的,那么每一个数据行的长度也将是固定的.
 
2、只要数据表里有一个数据列的长度是可变的,那么所有数据行的长度都是可变的.
 
3、如果某个数据表里的数据行的长度是可变的,那么,为了节约存储空间,MySQL会把这个数据表里的固定长度类型的数据列转换为相应的可变长度类型


1. 不同编码,能存储的字符数
 
 a.字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
 b.字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
 
  ps: 若定义的时候超过上述限制,则varchar字段会被强行转为 mediumtext类型 (mysql5.1.56),如下

<<A href="mailto:root@localhost">root@localhost nigel 17:10:05>alter table t1 modify id varchar(32766);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

<<A href="mailto:root@localhost">root@localhost nigel 17:10:30>show  create table t1;
+-------+--------------------------------------------------------------------------------------------+
| Table | Create Table                                                                               |
+-------+--------------------------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` varchar(32766) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+--------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

<<A href="mailto:root@localhost">root@localhost nigel 17:10:31>alter table t1 modify id varchar(32767);
ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs
<<A href="mailto:root@localhost">root@localhost nigel 17:10:36>alter table t1 modify id varchar(32768);
Query OK, 0 rows affected, 2 warnings (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

<<A href="mailto:root@localhost">root@localhost nigel 17:10:40>show  create table t1;
+-------+---------------------------------------------------------------------------+
| Table | Create Table                                                              |
+-------+---------------------------------------------------------------------------+
| t1    | CREATE TABLE `t1` (
  `id` mediumtext
) ENGINE=InnoDB DEFAULT CHARSET=gbk |
+-------+---------------------------------------------------------------------------+
1 row in set (0.00 sec)

2,计算方法
 1.   若一个表只有一个varchar类型,如定义为
 
   create table t1(id varchar(M)) charset=gbk;
 
   则此处M的最大值为(65535-1-2)/2= 32766
   * -1的原因是实际行存储从第二个字节开始
   * -2的是因varchar头部的2个字节表示长度
   * 除2的是因为字符编码是gbk
2, 若一个表定义为
 
create table t1(id int,grade char(30), text varchar(N)) charset=utf8;
 
 则此处M的最大值为 (65535-1-2-4-30*3)/3=21812
 
  -1和-2和上实例相同
 
 -4是因为int类型的id占4个字节;
 
 -30*3的原因是char(30)占用90个字节,编码是utf8
ps: 由上可见,在一张表里的char varchar 的类型字段的总长度是所有字段加和的

qq: 45899077

讨论群: 65576300

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值