MySQL VARCHAR存储大小

经常有开发在问建表语句的时候varchar字段的长度大小。或者建表语句中的字段varchar是乱写的。比如直接写个varchar(50000)。今天统一总结下:


提示:VARCHAR(N) 指的是可以存放的最大字符个数,不是字节数。
需要区分字符和字节。一个汉字,一个数字,一个字母都是一个字符。
字节是计算机的基础存储单元,8位一个字节。 具体区分可以查看 字符,字节和编码


因为VARCHAR列中的值为可变长字符串。长度可以指定为0到65,535之间的值。(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。所以不同字符集对应的varchar可以支持的最大长度是不一样的。
字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;
字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。
若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。


实践出真知:
表结构如下:
 CREATE TABLE `test2` (
  `a` int(11) NOT NULL,
  `b` varchar(4) DEFAULT NULL,
  PRIMARY KEY (`a`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 


插入数据:
mysql> insert into test2 values (1,'a');
Query OK, 1 row affected (0.04 sec)
mysql> insert into test2 values (2,'aa');
Query OK, 1 row affected (0.01 sec)


mysql> insert into test2 values (3,'aaa');
Query OK, 1 row affected (0.04 sec)


mysql> insert into test2 values (4,'aaaa');
Query OK, 1 row affected (0.08 sec)
mysql> insert into test2 values (5,'aaaaa');
Query OK, 1 row affected, 1 warning (0.04 sec)    //超过字段设定的最大长度,会出现警告,这个跟你设置的库SQL服务器模式有关系,也会报错。 出现警告后自动的截取最大长度的字符串


mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+




mysql> insert into test2 values (6,'te111');  //可以看到的是存储的是字符个数,而不是字节数
Query OK, 1 row affected, 1 warning (0.03 sec)


mysql> show warnings;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1265 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+


查询结果:
mysql> select * from test2;
+---+------+
| a | b    |
+---+------+
| 1 | a    |
| 2 | aa   |
| 3 | aaa  |
| 4 | aaaa |
| 5 | aaaa |
| 6 | te11 |
+---+------+


mysql>   CREATE TABLE `test3` (                   
    ->           `var` varchar(21845) default NULL   
    ->         ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    -> ;
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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值